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,
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"),
294 bfd_set_error (bfd_error_bad_value);
297 cache_ptr->howto = rl78_elf_howto_table + r_type;
302 get_symbol_value (const char * name,
303 struct bfd_link_info * info,
305 asection * input_section,
308 struct bfd_link_hash_entry * h;
313 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
316 || (h->type != bfd_link_hash_defined
317 && h->type != bfd_link_hash_defweak))
319 (*info->callbacks->undefined_symbol)
320 (info, name, input_bfd, input_section, offset, TRUE);
324 return (h->u.def.value
325 + h->u.def.section->output_section->vma
326 + h->u.def.section->output_offset);
330 get_romstart (struct bfd_link_info * info,
335 static bfd_boolean cached = FALSE;
336 static bfd_vma cached_value = 0;
340 cached_value = get_symbol_value ("_start", info, abfd, sec, offset);
347 get_ramstart (struct bfd_link_info * info,
352 static bfd_boolean cached = FALSE;
353 static bfd_vma cached_value = 0;
357 cached_value = get_symbol_value ("__datastart", info, abfd, sec, offset);
363 #define NUM_STACK_ENTRIES 16
364 static int32_t rl78_stack [ NUM_STACK_ENTRIES ];
365 static unsigned int rl78_stack_top;
367 #define RL78_STACK_PUSH(val) \
370 if (rl78_stack_top < NUM_STACK_ENTRIES) \
371 rl78_stack [rl78_stack_top ++] = (val); \
373 _bfd_error_handler (_("internal error: RL78 reloc stack overflow")); \
377 #define RL78_STACK_POP(dest) \
380 if (rl78_stack_top > 0) \
381 (dest) = rl78_stack [-- rl78_stack_top];\
384 _bfd_error_handler (_("internal error: RL78 reloc stack underflow")); \
390 /* Special handling for RL78 complex relocs. Returns the
391 value of the reloc, or 0 for relocs which do not generate
392 a result. SYMVAL is the value of the symbol for relocs
393 which use a symbolic argument. */
396 rl78_compute_complex_reloc (unsigned long r_type,
398 asection * input_section)
408 case R_RL78_ABS24S_PCREL:
409 case R_RL78_ABS16S_PCREL:
410 case R_RL78_ABS8S_PCREL:
411 RL78_STACK_POP (relocation);
412 relocation -= input_section->output_section->vma + input_section->output_offset;
416 case R_RL78_ABS32_REV:
418 case R_RL78_ABS16_REV:
424 RL78_STACK_POP (relocation);
429 RL78_STACK_POP (relocation);
430 return relocation >> 2;
434 RL78_STACK_POP (relocation);
435 return relocation >> 1;
437 /* The rest of the relocs compute values and then push them onto the stack. */
438 case R_RL78_OPramtop:
439 case R_RL78_OPromtop:
441 RL78_STACK_PUSH (symval);
445 RL78_STACK_POP (tmp1);
447 RL78_STACK_PUSH (tmp1);
451 RL78_STACK_POP (tmp2);
452 RL78_STACK_POP (tmp1);
454 RL78_STACK_PUSH (tmp1);
458 /* For the expression "A - B", the assembler pushes A,
459 then B, then OPSUB. So the first op we pop is B, not A. */
460 RL78_STACK_POP (tmp2); /* B */
461 RL78_STACK_POP (tmp1); /* A */
462 tmp1 -= tmp2; /* A - B */
463 RL78_STACK_PUSH (tmp1);
467 RL78_STACK_POP (tmp2);
468 RL78_STACK_POP (tmp1);
470 RL78_STACK_PUSH (tmp1);
474 RL78_STACK_POP (tmp2);
475 RL78_STACK_POP (tmp1);
477 RL78_STACK_PUSH (tmp1);
481 RL78_STACK_POP (tmp2);
482 RL78_STACK_POP (tmp1);
484 RL78_STACK_PUSH (tmp1);
488 RL78_STACK_POP (tmp2);
489 RL78_STACK_POP (tmp1);
491 RL78_STACK_PUSH (tmp1);
494 case R_RL78_OPsctsize:
495 RL78_STACK_PUSH (input_section->size);
498 case R_RL78_OPscttop:
499 RL78_STACK_PUSH (input_section->output_section->vma);
503 RL78_STACK_POP (tmp2);
504 RL78_STACK_POP (tmp1);
506 RL78_STACK_PUSH (tmp1);
510 RL78_STACK_POP (tmp2);
511 RL78_STACK_POP (tmp1);
513 RL78_STACK_PUSH (tmp1);
517 RL78_STACK_POP (tmp2);
518 RL78_STACK_POP (tmp1);
520 RL78_STACK_PUSH (tmp1);
524 RL78_STACK_POP (tmp1);
526 RL78_STACK_PUSH (tmp1);
530 RL78_STACK_POP (tmp2);
531 RL78_STACK_POP (tmp1);
533 RL78_STACK_PUSH (tmp1);
538 #undef RL78_STACK_PUSH
539 #undef RL78_STACK_POP
541 #define OP(i) (contents[reloc->address + (i)])
543 static bfd_reloc_status_type
544 rl78_special_reloc (bfd * input_bfd,
548 asection * input_section,
549 bfd * output_bfd ATTRIBUTE_UNUSED,
550 char ** error_message ATTRIBUTE_UNUSED)
552 bfd_reloc_status_type r = bfd_reloc_ok;
553 bfd_vma relocation = 0;
554 unsigned long r_type = reloc->howto->type;
555 bfd_byte * contents = data;
557 /* If necessary, compute the symbolic value of the relocation. */
561 relocation = (symbol->value
562 + symbol->section->output_section->vma
563 + symbol->section->output_offset
567 case R_RL78_OPromtop:
568 relocation = get_romstart (NULL, input_bfd, input_section,
572 case R_RL78_OPramtop:
573 relocation = get_ramstart (NULL, input_bfd, input_section,
578 /* Get the value of the relocation. */
579 relocation = rl78_compute_complex_reloc (r_type, relocation, input_section);
581 /* If the relocation alters the contents of the section then apply it now.
582 Note - since this function is called from
583 bfd_generic_get_relocated_section_contents via bfd_perform_relocation,
584 and not from the linker, we do not perform any range checking. The
585 clients who are calling us are only interested in some relocated section
586 contents, and not any linkage problems that might occur later. */
591 OP (1) = relocation >> 8;
592 OP (2) = relocation >> 16;
593 OP (3) = relocation >> 24;
596 case R_RL78_ABS32_REV:
598 OP (2) = relocation >> 8;
599 OP (1) = relocation >> 16;
600 OP (0) = relocation >> 24;
603 case R_RL78_ABS24S_PCREL:
606 OP (1) = relocation >> 8;
607 OP (2) = relocation >> 16;
610 case R_RL78_ABS16_REV:
612 OP (0) = relocation >> 8;
615 case R_RL78_ABS16S_PCREL:
622 OP (1) = relocation >> 8;
625 case R_RL78_ABS8S_PCREL:
642 #define OP(i) (contents[rel->r_offset + (i)])
644 /* Relocate an RL78 ELF section.
645 There is some attempt to make this function usable for many architectures,
646 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
647 if only to serve as a learning tool.
649 The RELOCATE_SECTION function is called by the new ELF backend linker
650 to handle the relocations for a section.
652 The relocs are always passed as Rela structures; if the section
653 actually uses Rel structures, the r_addend field will always be
656 This function is responsible for adjusting the section contents as
657 necessary, and (if using Rela relocs and generating a relocatable
658 output file) adjusting the reloc addend as necessary.
660 This function does not have to worry about setting the reloc
661 address or the reloc symbol index.
663 LOCAL_SYMS is a pointer to the swapped in local symbols.
665 LOCAL_SECTIONS is an array giving the section in the input file
666 corresponding to the st_shndx field of each local symbol.
668 The global hash table entry for the global symbols can be found
669 via elf_sym_hashes (input_bfd).
671 When generating relocatable output, this function must handle
672 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
673 going to be the section symbol corresponding to the output
674 section, which means that the addend must be adjusted
678 rl78_elf_relocate_section
680 struct bfd_link_info * info,
682 asection * input_section,
684 Elf_Internal_Rela * relocs,
685 Elf_Internal_Sym * local_syms,
686 asection ** local_sections)
688 Elf_Internal_Shdr * symtab_hdr;
689 struct elf_link_hash_entry ** sym_hashes;
690 Elf_Internal_Rela * rel;
691 Elf_Internal_Rela * relend;
694 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
695 sym_hashes = elf_sym_hashes (input_bfd);
696 relend = relocs + input_section->reloc_count;
698 splt = elf_hash_table (info)->splt;
700 for (rel = relocs; rel < relend; rel ++)
702 reloc_howto_type * howto;
703 unsigned long r_symndx;
704 Elf_Internal_Sym * sym;
706 struct elf_link_hash_entry * h;
708 bfd_reloc_status_type r;
709 const char * name = NULL;
710 bfd_boolean unresolved_reloc = TRUE;
713 r_type = ELF32_R_TYPE (rel->r_info);
714 r_symndx = ELF32_R_SYM (rel->r_info);
716 howto = rl78_elf_howto_table + ELF32_R_TYPE (rel->r_info);
722 if (r_symndx < symtab_hdr->sh_info)
724 sym = local_syms + r_symndx;
725 sec = local_sections [r_symndx];
726 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, & sec, rel);
728 name = bfd_elf_string_from_elf_section
729 (input_bfd, symtab_hdr->sh_link, sym->st_name);
730 name = (sym->st_name == 0) ? bfd_section_name (input_bfd, sec) : name;
734 bfd_boolean warned ATTRIBUTE_UNUSED;
735 bfd_boolean ignored ATTRIBUTE_UNUSED;
737 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
738 r_symndx, symtab_hdr, sym_hashes, h,
739 sec, relocation, unresolved_reloc,
742 name = h->root.root.string;
745 if (sec != NULL && discarded_section (sec))
746 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
747 rel, 1, relend, howto, 0, contents);
749 if (bfd_link_relocatable (info))
751 /* This is a relocatable link. We don't have to change
752 anything, unless the reloc is against a section symbol,
753 in which case we have to adjust according to where the
754 section symbol winds up in the output section. */
755 if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
756 rel->r_addend += sec->output_offset;
760 switch (ELF32_R_TYPE (rel->r_info))
767 plt_offset = &h->plt.offset;
769 plt_offset = elf_local_got_offsets (input_bfd) + r_symndx;
771 if (! valid_16bit_address (relocation))
773 /* If this is the first time we've processed this symbol,
774 fill in the plt entry with the correct symbol address. */
775 if ((*plt_offset & 1) == 0)
779 x = 0x000000ec; /* br !!abs24 */
780 x |= (relocation << 8) & 0xffffff00;
781 bfd_put_32 (input_bfd, x, splt->contents + *plt_offset);
785 relocation = (splt->output_section->vma
786 + splt->output_offset
787 + (*plt_offset & -2));
790 char *newname = bfd_malloc (strlen(name)+5);
791 strcpy (newname, name);
792 strcat(newname, ".plt");
793 _bfd_generic_link_add_one_symbol (info,
796 BSF_FUNCTION | BSF_WEAK,
809 if (h != NULL && h->root.type == bfd_link_hash_undefweak)
810 /* If the symbol is undefined and weak
811 then the relocation resolves to zero. */
815 if (howto->pc_relative)
817 relocation -= (input_section->output_section->vma
818 + input_section->output_offset
820 relocation -= bfd_get_reloc_size (howto);
823 relocation += rel->r_addend;
828 #define RANGE(a,b) if (a > (long) relocation || (long) relocation > b) r = bfd_reloc_overflow
830 /* Opcode relocs are always big endian. Data relocs are bi-endian. */
836 case R_RL78_RH_RELAX:
839 case R_RL78_DIR8S_PCREL:
854 case R_RL78_DIR16S_PCREL:
855 RANGE (-32768, 32767);
857 OP (1) = relocation >> 8;
861 if ((relocation & 0xf0000) == 0xf0000)
862 relocation &= 0xffff;
863 RANGE (-32768, 65535);
865 OP (1) = relocation >> 8;
871 OP (1) = relocation >> 8;
875 RANGE (-32768, 65536);
877 OP (1) = relocation >> 8;
880 case R_RL78_DIR16_REV:
881 RANGE (-32768, 65536);
883 OP (0) = relocation >> 8;
886 case R_RL78_DIR3U_PCREL:
889 OP (0) |= relocation & 0x07;
892 case R_RL78_DIR24S_PCREL:
893 RANGE (-0x800000, 0x7fffff);
895 OP (1) = relocation >> 8;
896 OP (2) = relocation >> 16;
900 RANGE (-0x800000, 0x7fffff);
902 OP (1) = relocation >> 8;
903 OP (2) = relocation >> 16;
908 OP (1) = relocation >> 8;
909 OP (2) = relocation >> 16;
910 OP (3) = relocation >> 24;
913 case R_RL78_DIR32_REV:
915 OP (2) = relocation >> 8;
916 OP (1) = relocation >> 16;
917 OP (0) = relocation >> 24;
921 RANGE (0xfff00, 0xfffff);
922 OP (0) = relocation & 0xff;
925 case R_RL78_RH_SADDR:
926 RANGE (0xffe20, 0xfff1f);
927 OP (0) = relocation & 0xff;
930 /* Complex reloc handling: */
932 case R_RL78_ABS32_REV:
933 case R_RL78_ABS24S_PCREL:
936 case R_RL78_ABS16_REV:
937 case R_RL78_ABS16S_PCREL:
946 case R_RL78_ABS8S_PCREL:
955 case R_RL78_OPsctsize:
956 case R_RL78_OPscttop:
962 relocation = rl78_compute_complex_reloc (r_type, 0, input_section);
968 OP (1) = relocation >> 8;
969 OP (2) = relocation >> 16;
970 OP (3) = relocation >> 24;
973 case R_RL78_ABS32_REV:
975 OP (2) = relocation >> 8;
976 OP (1) = relocation >> 16;
977 OP (0) = relocation >> 24;
980 case R_RL78_ABS24S_PCREL:
982 RANGE (-0x800000, 0x7fffff);
984 OP (1) = relocation >> 8;
985 OP (2) = relocation >> 16;
989 RANGE (-32768, 65535);
991 OP (1) = relocation >> 8;
994 case R_RL78_ABS16_REV:
995 RANGE (-32768, 65535);
997 OP (0) = relocation >> 8;
1000 case R_RL78_ABS16S_PCREL:
1002 RANGE (-32768, 32767);
1003 OP (0) = relocation;
1004 OP (1) = relocation >> 8;
1008 case R_RL78_ABS16UL:
1009 case R_RL78_ABS16UW:
1011 OP (0) = relocation;
1012 OP (1) = relocation >> 8;
1017 OP (0) = relocation;
1024 OP (0) = relocation;
1027 case R_RL78_ABS8S_PCREL:
1030 OP (0) = relocation;
1039 if (r_symndx < symtab_hdr->sh_info)
1040 relocation = sec->output_section->vma + sec->output_offset
1041 + sym->st_value + rel->r_addend;
1043 && (h->root.type == bfd_link_hash_defined
1044 || h->root.type == bfd_link_hash_defweak))
1045 relocation = h->root.u.def.value
1046 + sec->output_section->vma
1047 + sec->output_offset
1052 if (h->root.type != bfd_link_hash_undefweak)
1054 (_("warning: RL78_SYM reloc with an unknown symbol"));
1056 (void) rl78_compute_complex_reloc (r_type, relocation, input_section);
1059 case R_RL78_OPromtop:
1060 relocation = get_romstart (info, input_bfd, input_section, rel->r_offset);
1061 (void) rl78_compute_complex_reloc (r_type, relocation, input_section);
1064 case R_RL78_OPramtop:
1065 relocation = get_ramstart (info, input_bfd, input_section, rel->r_offset);
1066 (void) rl78_compute_complex_reloc (r_type, relocation, input_section);
1070 r = bfd_reloc_notsupported;
1074 if (r != bfd_reloc_ok)
1076 const char * msg = NULL;
1080 case bfd_reloc_overflow:
1081 /* Catch the case of a missing function declaration
1082 and emit a more helpful error message. */
1083 if (r_type == R_RL78_DIR24S_PCREL)
1084 /* xgettext:c-format */
1085 msg = _("%pB(%pA): error: call to undefined function '%s'");
1087 (*info->callbacks->reloc_overflow)
1088 (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
1089 input_bfd, input_section, rel->r_offset);
1092 case bfd_reloc_undefined:
1093 (*info->callbacks->undefined_symbol)
1094 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1097 case bfd_reloc_other:
1098 /* xgettext:c-format */
1099 msg = _("%pB(%pA): warning: unaligned access to symbol '%s' in the small data area");
1102 case bfd_reloc_outofrange:
1103 /* xgettext:c-format */
1104 msg = _("%pB(%pA): internal error: out of range error");
1107 case bfd_reloc_notsupported:
1108 /* xgettext:c-format */
1109 msg = _("%pB(%pA): internal error: unsupported relocation error");
1112 case bfd_reloc_dangerous:
1113 /* xgettext:c-format */
1114 msg = _("%pB(%pA): internal error: dangerous relocation");
1118 /* xgettext:c-format */
1119 msg = _("%pB(%pA): internal error: unknown error");
1124 _bfd_error_handler (msg, input_bfd, input_section, name);
1131 /* Function to set the ELF flag bits. */
1134 rl78_elf_set_private_flags (bfd * abfd, flagword flags)
1136 elf_elfheader (abfd)->e_flags = flags;
1137 elf_flags_init (abfd) = TRUE;
1141 static bfd_boolean no_warn_mismatch = FALSE;
1143 void bfd_elf32_rl78_set_target_flags (bfd_boolean);
1146 bfd_elf32_rl78_set_target_flags (bfd_boolean user_no_warn_mismatch)
1148 no_warn_mismatch = user_no_warn_mismatch;
1152 rl78_cpu_name (flagword flags)
1154 switch (flags & E_FLAG_RL78_CPU_MASK)
1157 case E_FLAG_RL78_G10: return "G10";
1158 case E_FLAG_RL78_G13: return "G13";
1159 case E_FLAG_RL78_G14: return "G14";
1163 /* Merge backend specific data from an object file to the output
1164 object file when linking. */
1167 rl78_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
1169 bfd *obfd = info->output_bfd;
1172 bfd_boolean error = FALSE;
1174 new_flags = elf_elfheader (ibfd)->e_flags;
1175 old_flags = elf_elfheader (obfd)->e_flags;
1177 if (!elf_flags_init (obfd))
1179 /* First call, no flags set. */
1180 elf_flags_init (obfd) = TRUE;
1181 elf_elfheader (obfd)->e_flags = new_flags;
1183 else if (old_flags != new_flags)
1185 flagword changed_flags = old_flags ^ new_flags;
1187 if (changed_flags & E_FLAG_RL78_CPU_MASK)
1189 flagword out_cpu = old_flags & E_FLAG_RL78_CPU_MASK;
1190 flagword in_cpu = new_flags & E_FLAG_RL78_CPU_MASK;
1192 if (in_cpu == E_FLAG_RL78_ANY_CPU || in_cpu == out_cpu)
1193 /* It does not matter what new_cpu may have. */;
1194 else if (out_cpu == E_FLAG_RL78_ANY_CPU)
1196 if (in_cpu == E_FLAG_RL78_G10)
1198 /* G10 files can only be linked with other G10 files.
1199 If the output is set to "any" this means that it is
1200 a G14 file that does not use hardware multiply/divide,
1201 but that is still incompatible with the G10 ABI. */
1205 /* xgettext:c-format */
1206 (_("RL78 ABI conflict: G10 file %pB cannot be linked"
1207 " with %s file %pB"),
1208 ibfd, rl78_cpu_name (out_cpu), obfd);
1212 old_flags &= ~ E_FLAG_RL78_CPU_MASK;
1213 old_flags |= in_cpu;
1214 elf_elfheader (obfd)->e_flags = old_flags;
1222 /* xgettext:c-format */
1223 (_("RL78 ABI conflict: cannot link %s file %pB with %s file %pB"),
1224 rl78_cpu_name (in_cpu), ibfd,
1225 rl78_cpu_name (out_cpu), obfd);
1229 if (changed_flags & E_FLAG_RL78_64BIT_DOUBLES)
1232 (_("RL78 merge conflict: cannot link 32-bit and 64-bit objects together"));
1234 if (old_flags & E_FLAG_RL78_64BIT_DOUBLES)
1235 /* xgettext:c-format */
1236 _bfd_error_handler (_("- %pB is 64-bit, %pB is not"),
1239 /* xgettext:c-format */
1240 _bfd_error_handler (_("- %pB is 64-bit, %pB is not"),
1250 rl78_elf_print_private_bfd_data (bfd * abfd, void * ptr)
1252 FILE * file = (FILE *) ptr;
1255 BFD_ASSERT (abfd != NULL && ptr != NULL);
1257 /* Print normal ELF private data. */
1258 _bfd_elf_print_private_bfd_data (abfd, ptr);
1260 flags = elf_elfheader (abfd)->e_flags;
1261 fprintf (file, _("private flags = 0x%lx:"), (long) flags);
1263 if (flags & E_FLAG_RL78_CPU_MASK)
1264 fprintf (file, " [%s]", rl78_cpu_name (flags));
1266 if (flags & E_FLAG_RL78_64BIT_DOUBLES)
1267 fprintf (file, _(" [64-bit doubles]"));
1273 /* Return the MACH for an e_flags value. */
1276 elf32_rl78_machine (bfd * abfd ATTRIBUTE_UNUSED)
1278 return bfd_mach_rl78;
1282 rl78_elf_object_p (bfd * abfd)
1284 bfd_default_set_arch_mach (abfd, bfd_arch_rl78,
1285 elf32_rl78_machine (abfd));
1289 /* support PLT for 16-bit references to 24-bit functions. */
1291 /* We support 16-bit pointers to code above 64k by generating a thunk
1292 below 64k containing a JMP instruction to the final address. */
1295 rl78_elf_check_relocs
1297 struct bfd_link_info * info,
1299 const Elf_Internal_Rela * relocs)
1301 Elf_Internal_Shdr * symtab_hdr;
1302 struct elf_link_hash_entry ** sym_hashes;
1303 const Elf_Internal_Rela * rel;
1304 const Elf_Internal_Rela * rel_end;
1305 bfd_vma *local_plt_offsets;
1309 if (bfd_link_relocatable (info))
1312 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1313 sym_hashes = elf_sym_hashes (abfd);
1314 local_plt_offsets = elf_local_got_offsets (abfd);
1315 dynobj = elf_hash_table(info)->dynobj;
1317 rel_end = relocs + sec->reloc_count;
1318 for (rel = relocs; rel < rel_end; rel++)
1320 struct elf_link_hash_entry *h;
1321 unsigned long r_symndx;
1324 r_symndx = ELF32_R_SYM (rel->r_info);
1325 if (r_symndx < symtab_hdr->sh_info)
1329 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1330 while (h->root.type == bfd_link_hash_indirect
1331 || h->root.type == bfd_link_hash_warning)
1332 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1335 switch (ELF32_R_TYPE (rel->r_info))
1337 /* This relocation describes a 16-bit pointer to a function.
1338 We may need to allocate a thunk in low memory; reserve memory
1342 elf_hash_table (info)->dynobj = dynobj = abfd;
1343 splt = elf_hash_table (info)->splt;
1346 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1347 | SEC_IN_MEMORY | SEC_LINKER_CREATED
1348 | SEC_READONLY | SEC_CODE);
1349 splt = bfd_make_section_anyway_with_flags (dynobj, ".plt",
1351 elf_hash_table (info)->splt = splt;
1353 || ! bfd_set_section_alignment (dynobj, splt, 1))
1358 offset = &h->plt.offset;
1361 if (local_plt_offsets == NULL)
1366 size = symtab_hdr->sh_info * sizeof (bfd_vma);
1367 local_plt_offsets = (bfd_vma *) bfd_alloc (abfd, size);
1368 if (local_plt_offsets == NULL)
1370 elf_local_got_offsets (abfd) = local_plt_offsets;
1372 for (i = 0; i < symtab_hdr->sh_info; i++)
1373 local_plt_offsets[i] = (bfd_vma) -1;
1375 offset = &local_plt_offsets[r_symndx];
1378 if (*offset == (bfd_vma) -1)
1380 *offset = splt->size;
1390 /* This must exist if dynobj is ever set. */
1393 rl78_elf_finish_dynamic_sections (bfd *abfd ATTRIBUTE_UNUSED,
1394 struct bfd_link_info *info)
1399 if (!elf_hash_table (info)->dynamic_sections_created)
1402 /* As an extra sanity check, verify that all plt entries have been
1403 filled in. However, relaxing might have changed the relocs so
1404 that some plt entries don't get filled in, so we have to skip
1405 this check if we're relaxing. Unfortunately, check_relocs is
1406 called before relaxation. */
1408 if (info->relax_trip > 0)
1411 dynobj = elf_hash_table (info)->dynobj;
1412 splt = elf_hash_table (info)->splt;
1413 if (dynobj != NULL && splt != NULL)
1415 bfd_byte *contents = splt->contents;
1416 unsigned int i, size = splt->size;
1418 for (i = 0; i < size; i += 4)
1420 unsigned int x = bfd_get_32 (dynobj, contents + i);
1421 BFD_ASSERT (x != 0);
1429 rl78_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1430 struct bfd_link_info *info)
1435 if (bfd_link_relocatable (info))
1438 dynobj = elf_hash_table (info)->dynobj;
1442 splt = elf_hash_table (info)->splt;
1443 BFD_ASSERT (splt != NULL);
1445 splt->contents = (bfd_byte *) bfd_zalloc (dynobj, splt->size);
1446 if (splt->contents == NULL)
1454 /* Handle relaxing. */
1456 /* A subroutine of rl78_elf_relax_section. If the global symbol H
1457 is within the low 64k, remove any entry for it in the plt. */
1459 struct relax_plt_data
1466 rl78_relax_plt_check (struct elf_link_hash_entry *h, void * xdata)
1468 struct relax_plt_data *data = (struct relax_plt_data *) xdata;
1470 if (h->plt.offset != (bfd_vma) -1)
1474 if (h->root.type == bfd_link_hash_undefined
1475 || h->root.type == bfd_link_hash_undefweak)
1478 address = (h->root.u.def.section->output_section->vma
1479 + h->root.u.def.section->output_offset
1480 + h->root.u.def.value);
1482 if (valid_16bit_address (address))
1485 data->splt->size -= 4;
1486 *data->again = TRUE;
1493 /* A subroutine of rl78_elf_relax_section. If the global symbol H
1494 previously had a plt entry, give it a new entry offset. */
1497 rl78_relax_plt_realloc (struct elf_link_hash_entry *h, void * xdata)
1499 bfd_vma *entry = (bfd_vma *) xdata;
1501 if (h->plt.offset != (bfd_vma) -1)
1503 h->plt.offset = *entry;
1511 rl78_elf_relax_plt_section (bfd *dynobj,
1513 struct bfd_link_info *info,
1516 struct relax_plt_data relax_plt_data;
1519 /* Assume nothing changes. */
1522 if (bfd_link_relocatable (info))
1525 /* We only relax the .plt section at the moment. */
1526 if (dynobj != elf_hash_table (info)->dynobj
1527 || strcmp (splt->name, ".plt") != 0)
1530 /* Quick check for an empty plt. */
1531 if (splt->size == 0)
1534 /* Map across all global symbols; see which ones happen to
1535 fall in the low 64k. */
1536 relax_plt_data.splt = splt;
1537 relax_plt_data.again = again;
1538 elf_link_hash_traverse (elf_hash_table (info), rl78_relax_plt_check,
1541 /* Likewise for local symbols, though that's somewhat less convenient
1542 as we have to walk the list of input bfds and swap in symbol data. */
1543 for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1545 bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1546 Elf_Internal_Shdr *symtab_hdr;
1547 Elf_Internal_Sym *isymbuf = NULL;
1550 if (! local_plt_offsets)
1553 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1554 if (symtab_hdr->sh_info != 0)
1556 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1557 if (isymbuf == NULL)
1558 isymbuf = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
1559 symtab_hdr->sh_info, 0,
1561 if (isymbuf == NULL)
1565 for (idx = 0; idx < symtab_hdr->sh_info; ++idx)
1567 Elf_Internal_Sym *isym;
1571 if (local_plt_offsets[idx] == (bfd_vma) -1)
1574 isym = &isymbuf[idx];
1575 if (isym->st_shndx == SHN_UNDEF)
1577 else if (isym->st_shndx == SHN_ABS)
1578 tsec = bfd_abs_section_ptr;
1579 else if (isym->st_shndx == SHN_COMMON)
1580 tsec = bfd_com_section_ptr;
1582 tsec = bfd_section_from_elf_index (ibfd, isym->st_shndx);
1584 address = (tsec->output_section->vma
1585 + tsec->output_offset
1587 if (valid_16bit_address (address))
1589 local_plt_offsets[idx] = -1;
1596 && symtab_hdr->contents != (unsigned char *) isymbuf)
1598 if (! info->keep_memory)
1602 /* Cache the symbols for elf_link_input_bfd. */
1603 symtab_hdr->contents = (unsigned char *) isymbuf;
1608 /* If we changed anything, walk the symbols again to reallocate
1609 .plt entry addresses. */
1610 if (*again && splt->size > 0)
1614 elf_link_hash_traverse (elf_hash_table (info),
1615 rl78_relax_plt_realloc, &entry);
1617 for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1619 bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1620 unsigned int nlocals = elf_tdata (ibfd)->symtab_hdr.sh_info;
1623 if (! local_plt_offsets)
1626 for (idx = 0; idx < nlocals; ++idx)
1627 if (local_plt_offsets[idx] != (bfd_vma) -1)
1629 local_plt_offsets[idx] = entry;
1638 /* Delete some bytes from a section while relaxing. */
1641 elf32_rl78_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count,
1642 Elf_Internal_Rela *alignment_rel, int force_snip)
1644 Elf_Internal_Shdr * symtab_hdr;
1645 unsigned int sec_shndx;
1646 bfd_byte * contents;
1647 Elf_Internal_Rela * irel;
1648 Elf_Internal_Rela * irelend;
1649 Elf_Internal_Sym * isym;
1650 Elf_Internal_Sym * isymend;
1652 unsigned int symcount;
1653 struct elf_link_hash_entry ** sym_hashes;
1654 struct elf_link_hash_entry ** end_hashes;
1659 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1661 contents = elf_section_data (sec)->this_hdr.contents;
1663 /* The deletion must stop at the next alignment boundary, if
1664 ALIGNMENT_REL is non-NULL. */
1667 toaddr = alignment_rel->r_offset;
1669 irel = elf_section_data (sec)->relocs;
1672 _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL, TRUE);
1673 irel = elf_section_data (sec)->relocs;
1676 irelend = irel + sec->reloc_count;
1678 /* Actually delete the bytes. */
1679 memmove (contents + addr, contents + addr + count,
1680 (size_t) (toaddr - addr - count));
1682 /* If we don't have an alignment marker to worry about, we can just
1683 shrink the section. Otherwise, we have to fill in the newly
1684 created gap with NOP insns (0x03). */
1688 memset (contents + toaddr - count, 0x03, count);
1690 /* Adjust all the relocs. */
1691 for (; irel && irel < irelend; irel++)
1693 /* Get the new reloc address. */
1694 if (irel->r_offset > addr
1695 && (irel->r_offset < toaddr
1696 || (force_snip && irel->r_offset == toaddr)))
1697 irel->r_offset -= count;
1699 /* If we see an ALIGN marker at the end of the gap, we move it
1700 to the beginning of the gap, since marking these gaps is what
1702 if (irel->r_offset == toaddr
1703 && ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
1704 && irel->r_addend & RL78_RELAXA_ALIGN)
1705 irel->r_offset -= count;
1708 /* Adjust the local symbols defined in this section. */
1709 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1710 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1711 isymend = isym + symtab_hdr->sh_info;
1713 for (; isym < isymend; isym++)
1715 /* If the symbol is in the range of memory we just moved, we
1716 have to adjust its value. */
1717 if (isym->st_shndx == sec_shndx
1718 && isym->st_value > addr
1719 && isym->st_value < toaddr)
1720 isym->st_value -= count;
1722 /* If the symbol *spans* the bytes we just deleted (i.e. it's
1723 *end* is in the moved bytes but it's *start* isn't), then we
1724 must adjust its size. */
1725 if (isym->st_shndx == sec_shndx
1726 && isym->st_value < addr
1727 && isym->st_value + isym->st_size > addr
1728 && isym->st_value + isym->st_size < toaddr)
1729 isym->st_size -= count;
1732 /* Now adjust the global symbols defined in this section. */
1733 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1734 - symtab_hdr->sh_info);
1735 sym_hashes = elf_sym_hashes (abfd);
1736 end_hashes = sym_hashes + symcount;
1738 for (; sym_hashes < end_hashes; sym_hashes++)
1740 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1742 if ((sym_hash->root.type == bfd_link_hash_defined
1743 || sym_hash->root.type == bfd_link_hash_defweak)
1744 && sym_hash->root.u.def.section == sec)
1746 /* As above, adjust the value if needed. */
1747 if (sym_hash->root.u.def.value > addr
1748 && sym_hash->root.u.def.value < toaddr)
1749 sym_hash->root.u.def.value -= count;
1751 /* As above, adjust the size if needed. */
1752 if (sym_hash->root.u.def.value < addr
1753 && sym_hash->root.u.def.value + sym_hash->size > addr
1754 && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1755 sym_hash->size -= count;
1762 /* Used to sort relocs by address. If relocs have the same address,
1763 we maintain their relative order, except that R_RL78_RH_RELAX
1764 alignment relocs must be the first reloc for any given address. */
1767 reloc_bubblesort (Elf_Internal_Rela * r, int count)
1771 bfd_boolean swappit;
1773 /* This is almost a classic bubblesort. It's the slowest sort, but
1774 we're taking advantage of the fact that the relocations are
1775 mostly in order already (the assembler emits them that way) and
1776 we need relocs with the same address to remain in the same
1782 for (i = 0; i < count - 1; i ++)
1784 if (r[i].r_offset > r[i + 1].r_offset)
1786 else if (r[i].r_offset < r[i + 1].r_offset)
1788 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
1789 && (r[i + 1].r_addend & RL78_RELAXA_ALIGN))
1791 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
1792 && (r[i + 1].r_addend & RL78_RELAXA_ELIGN)
1793 && !(ELF32_R_TYPE (r[i].r_info) == R_RL78_RH_RELAX
1794 && (r[i].r_addend & RL78_RELAXA_ALIGN)))
1801 Elf_Internal_Rela tmp;
1806 /* If we do move a reloc back, re-scan to see if it
1807 needs to be moved even further back. This avoids
1808 most of the O(n^2) behavior for our cases. */
1818 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
1819 rl78_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1820 lrel, abfd, sec, link_info, scale)
1823 rl78_offset_for_reloc (bfd * abfd,
1824 Elf_Internal_Rela * rel,
1825 Elf_Internal_Shdr * symtab_hdr,
1826 Elf_External_Sym_Shndx * shndx_buf ATTRIBUTE_UNUSED,
1827 Elf_Internal_Sym * intsyms,
1828 Elf_Internal_Rela ** lrel,
1830 asection * input_section,
1831 struct bfd_link_info * info,
1838 /* REL is the first of 1..N relocations. We compute the symbol
1839 value for each relocation, then combine them if needed. LREL
1840 gets a pointer to the last relocation used. */
1843 unsigned long r_type;
1845 /* Get the value of the symbol referred to by the reloc. */
1846 if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1848 /* A local symbol. */
1849 Elf_Internal_Sym *isym;
1852 isym = intsyms + ELF32_R_SYM (rel->r_info);
1854 if (isym->st_shndx == SHN_UNDEF)
1855 ssec = bfd_und_section_ptr;
1856 else if (isym->st_shndx == SHN_ABS)
1857 ssec = bfd_abs_section_ptr;
1858 else if (isym->st_shndx == SHN_COMMON)
1859 ssec = bfd_com_section_ptr;
1861 ssec = bfd_section_from_elf_index (abfd,
1864 /* Initial symbol value. */
1865 symval = isym->st_value;
1867 /* GAS may have made this symbol relative to a section, in
1868 which case, we have to add the addend to find the
1870 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
1871 symval += rel->r_addend;
1875 if ((ssec->flags & SEC_MERGE)
1876 && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
1877 symval = _bfd_merged_section_offset (abfd, & ssec,
1878 elf_section_data (ssec)->sec_info,
1882 /* Now make the offset relative to where the linker is putting it. */
1885 ssec->output_section->vma + ssec->output_offset;
1887 symval += rel->r_addend;
1892 struct elf_link_hash_entry * h;
1894 /* An external symbol. */
1895 indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1896 h = elf_sym_hashes (abfd)[indx];
1897 BFD_ASSERT (h != NULL);
1899 if (h->root.type != bfd_link_hash_defined
1900 && h->root.type != bfd_link_hash_defweak)
1902 /* This appears to be a reference to an undefined
1903 symbol. Just ignore it--it will be caught by the
1904 regular reloc processing. */
1910 symval = (h->root.u.def.value
1911 + h->root.u.def.section->output_section->vma
1912 + h->root.u.def.section->output_offset);
1914 symval += rel->r_addend;
1917 r_type = ELF32_R_TYPE (rel->r_info);
1921 (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1924 case R_RL78_OPromtop:
1925 symval = get_romstart (info, input_bfd, input_section, rel->r_offset);
1926 (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1929 case R_RL78_OPramtop:
1930 symval = get_ramstart (info, input_bfd, input_section, rel->r_offset);
1931 (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1941 case R_RL78_OPsctsize:
1942 case R_RL78_OPscttop:
1948 (void) rl78_compute_complex_reloc (r_type, 0, input_section);
1951 case R_RL78_DIR16UL:
1953 case R_RL78_ABS16UL:
1956 goto reloc_computes_value;
1958 case R_RL78_DIR16UW:
1960 case R_RL78_ABS16UW:
1963 goto reloc_computes_value;
1966 reloc_computes_value:
1967 symval = rl78_compute_complex_reloc (r_type, symval, input_section);
1974 case R_RL78_DIR24S_PCREL:
1975 case R_RL78_DIR16S_PCREL:
1976 case R_RL78_DIR8S_PCREL:
1987 int prefix; /* or -1 for "no prefix" */
1988 int insn; /* or -1 for "end of list" */
1989 int insn_for_saddr; /* or -1 for "no alternative" */
1990 int insn_for_sfr; /* or -1 for "no alternative" */
1991 } relax_addr16[] = {
1992 { -1, 0x02, 0x06, -1 }, /* ADDW AX, !addr16 */
1993 { -1, 0x22, 0x26, -1 }, /* SUBW AX, !addr16 */
1994 { -1, 0x42, 0x46, -1 }, /* CMPW AX, !addr16 */
1995 { -1, 0x40, 0x4a, -1 }, /* CMP !addr16, #byte */
1997 { -1, 0x0f, 0x0b, -1 }, /* ADD A, !addr16 */
1998 { -1, 0x1f, 0x1b, -1 }, /* ADDC A, !addr16 */
1999 { -1, 0x2f, 0x2b, -1 }, /* SUB A, !addr16 */
2000 { -1, 0x3f, 0x3b, -1 }, /* SUBC A, !addr16 */
2001 { -1, 0x4f, 0x4b, -1 }, /* CMP A, !addr16 */
2002 { -1, 0x5f, 0x5b, -1 }, /* AND A, !addr16 */
2003 { -1, 0x6f, 0x6b, -1 }, /* OR A, !addr16 */
2004 { -1, 0x7f, 0x7b, -1 }, /* XOR A, !addr16 */
2006 { -1, 0x8f, 0x8d, 0x8e }, /* MOV A, !addr16 */
2007 { -1, 0x9f, 0x9d, 0x9e }, /* MOV !addr16, A */
2008 { -1, 0xaf, 0xad, 0xae }, /* MOVW AX, !addr16 */
2009 { -1, 0xbf, 0xbd, 0xbe }, /* MOVW !addr16, AX */
2010 { -1, 0xcf, 0xcd, 0xce }, /* MOVW !addr16, #word */
2012 { -1, 0xa0, 0xa4, -1 }, /* INC !addr16 */
2013 { -1, 0xa2, 0xa6, -1 }, /* INCW !addr16 */
2014 { -1, 0xb0, 0xb4, -1 }, /* DEC !addr16 */
2015 { -1, 0xb2, 0xb6, -1 }, /* DECW !addr16 */
2017 { -1, 0xd5, 0xd4, -1 }, /* CMP0 !addr16 */
2018 { -1, 0xe5, 0xe4, -1 }, /* ONEB !addr16 */
2019 { -1, 0xf5, 0xf4, -1 }, /* CLRB !addr16 */
2021 { -1, 0xd9, 0xd8, -1 }, /* MOV X, !addr16 */
2022 { -1, 0xe9, 0xe8, -1 }, /* MOV B, !addr16 */
2023 { -1, 0xf9, 0xf8, -1 }, /* MOV C, !addr16 */
2024 { -1, 0xdb, 0xda, -1 }, /* MOVW BC, !addr16 */
2025 { -1, 0xeb, 0xea, -1 }, /* MOVW DE, !addr16 */
2026 { -1, 0xfb, 0xfa, -1 }, /* MOVW HL, !addr16 */
2028 { 0x61, 0xaa, 0xa8, -1 }, /* XCH A, !addr16 */
2030 { 0x71, 0x00, 0x02, 0x0a }, /* SET1 !addr16.0 */
2031 { 0x71, 0x10, 0x12, 0x1a }, /* SET1 !addr16.0 */
2032 { 0x71, 0x20, 0x22, 0x2a }, /* SET1 !addr16.0 */
2033 { 0x71, 0x30, 0x32, 0x3a }, /* SET1 !addr16.0 */
2034 { 0x71, 0x40, 0x42, 0x4a }, /* SET1 !addr16.0 */
2035 { 0x71, 0x50, 0x52, 0x5a }, /* SET1 !addr16.0 */
2036 { 0x71, 0x60, 0x62, 0x6a }, /* SET1 !addr16.0 */
2037 { 0x71, 0x70, 0x72, 0x7a }, /* SET1 !addr16.0 */
2039 { 0x71, 0x08, 0x03, 0x0b }, /* CLR1 !addr16.0 */
2040 { 0x71, 0x18, 0x13, 0x1b }, /* CLR1 !addr16.0 */
2041 { 0x71, 0x28, 0x23, 0x2b }, /* CLR1 !addr16.0 */
2042 { 0x71, 0x38, 0x33, 0x3b }, /* CLR1 !addr16.0 */
2043 { 0x71, 0x48, 0x43, 0x4b }, /* CLR1 !addr16.0 */
2044 { 0x71, 0x58, 0x53, 0x5b }, /* CLR1 !addr16.0 */
2045 { 0x71, 0x68, 0x63, 0x6b }, /* CLR1 !addr16.0 */
2046 { 0x71, 0x78, 0x73, 0x7b }, /* CLR1 !addr16.0 */
2051 /* Relax one section. */
2054 rl78_elf_relax_section
2057 struct bfd_link_info * link_info,
2058 bfd_boolean * again)
2060 Elf_Internal_Shdr * symtab_hdr;
2061 Elf_Internal_Shdr * shndx_hdr;
2062 Elf_Internal_Rela * internal_relocs;
2063 Elf_Internal_Rela * free_relocs = NULL;
2064 Elf_Internal_Rela * irel;
2065 Elf_Internal_Rela * srel;
2066 Elf_Internal_Rela * irelend;
2067 Elf_Internal_Rela * next_alignment;
2068 bfd_byte * contents = NULL;
2069 bfd_byte * free_contents = NULL;
2070 Elf_Internal_Sym * intsyms = NULL;
2071 Elf_Internal_Sym * free_intsyms = NULL;
2072 Elf_External_Sym_Shndx * shndx_buf = NULL;
2074 bfd_vma symval ATTRIBUTE_UNUSED = 0;
2075 int pcrel ATTRIBUTE_UNUSED = 0;
2076 int code ATTRIBUTE_UNUSED = 0;
2077 int section_alignment_glue;
2080 if (abfd == elf_hash_table (link_info)->dynobj
2081 && strcmp (sec->name, ".plt") == 0)
2082 return rl78_elf_relax_plt_section (abfd, sec, link_info, again);
2084 /* Assume nothing changes. */
2087 /* We don't have to do anything for a relocatable link, if
2088 this section does not have relocs, or if this is not a
2090 if (bfd_link_relocatable (link_info)
2091 || (sec->flags & SEC_RELOC) == 0
2092 || sec->reloc_count == 0
2093 || (sec->flags & SEC_CODE) == 0)
2096 symtab_hdr = & elf_symtab_hdr (abfd);
2097 if (elf_symtab_shndx_list (abfd))
2098 shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
2102 /* Get the section contents. */
2103 if (elf_section_data (sec)->this_hdr.contents != NULL)
2104 contents = elf_section_data (sec)->this_hdr.contents;
2105 /* Go get them off disk. */
2108 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2110 elf_section_data (sec)->this_hdr.contents = contents;
2113 /* Read this BFD's symbols. */
2114 /* Get cached copy if it exists. */
2115 if (symtab_hdr->contents != NULL)
2116 intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
2119 intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
2120 symtab_hdr->contents = (bfd_byte *) intsyms;
2123 if (shndx_hdr && shndx_hdr->sh_size != 0)
2127 amt = symtab_hdr->sh_info;
2128 amt *= sizeof (Elf_External_Sym_Shndx);
2129 shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
2130 if (shndx_buf == NULL)
2132 if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
2133 || bfd_bread (shndx_buf, amt, abfd) != amt)
2135 shndx_hdr->contents = (bfd_byte *) shndx_buf;
2138 /* Get a copy of the native relocations. */
2139 internal_relocs = (_bfd_elf_link_read_relocs
2140 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2141 link_info->keep_memory));
2142 if (internal_relocs == NULL)
2144 if (! link_info->keep_memory)
2145 free_relocs = internal_relocs;
2147 /* The RL_ relocs must be just before the operand relocs they go
2148 with, so we must sort them to guarantee this. We use bubblesort
2149 instead of qsort so we can guarantee that relocs with the same
2150 address remain in the same relative order. */
2151 reloc_bubblesort (internal_relocs, sec->reloc_count);
2153 /* Walk through them looking for relaxing opportunities. */
2154 irelend = internal_relocs + sec->reloc_count;
2157 /* This will either be NULL or a pointer to the next alignment
2159 next_alignment = internal_relocs;
2161 /* We calculate worst case shrinkage caused by alignment directives.
2162 No fool-proof, but better than either ignoring the problem or
2163 doing heavy duty analysis of all the alignment markers in all
2165 section_alignment_glue = 0;
2166 for (irel = internal_relocs; irel < irelend; irel++)
2167 if (ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
2168 && irel->r_addend & RL78_RELAXA_ALIGN)
2170 int this_glue = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
2172 if (section_alignment_glue < this_glue)
2173 section_alignment_glue = this_glue;
2175 /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
2177 section_alignment_glue *= 2;
2179 for (irel = internal_relocs; irel < irelend; irel++)
2181 unsigned char *insn;
2184 /* The insns we care about are all marked with one of these. */
2185 if (ELF32_R_TYPE (irel->r_info) != R_RL78_RH_RELAX)
2188 if (irel->r_addend & RL78_RELAXA_ALIGN
2189 || next_alignment == internal_relocs)
2191 /* When we delete bytes, we need to maintain all the alignments
2192 indicated. In addition, we need to be careful about relaxing
2193 jumps across alignment boundaries - these displacements
2194 *grow* when we delete bytes. For now, don't shrink
2195 displacements across an alignment boundary, just in case.
2196 Note that this only affects relocations to the same
2198 next_alignment += 2;
2199 while (next_alignment < irelend
2200 && (ELF32_R_TYPE (next_alignment->r_info) != R_RL78_RH_RELAX
2201 || !(next_alignment->r_addend & RL78_RELAXA_ELIGN)))
2203 if (next_alignment >= irelend || next_alignment->r_offset == 0)
2204 next_alignment = NULL;
2207 /* When we hit alignment markers, see if we've shrunk enough
2208 before them to reduce the gap without violating the alignment
2210 if (irel->r_addend & RL78_RELAXA_ALIGN)
2212 /* At this point, the next relocation *should* be the ELIGN
2214 Elf_Internal_Rela *erel = irel + 1;
2215 unsigned int alignment, nbytes;
2217 if (ELF32_R_TYPE (erel->r_info) != R_RL78_RH_RELAX)
2219 if (!(erel->r_addend & RL78_RELAXA_ELIGN))
2222 alignment = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
2224 if (erel->r_offset - irel->r_offset < alignment)
2227 nbytes = erel->r_offset - irel->r_offset;
2228 nbytes /= alignment;
2229 nbytes *= alignment;
2231 elf32_rl78_relax_delete_bytes (abfd, sec, erel->r_offset - nbytes, nbytes,
2232 next_alignment, erel->r_offset == sec->size);
2238 if (irel->r_addend & RL78_RELAXA_ELIGN)
2241 insn = contents + irel->r_offset;
2243 nrelocs = irel->r_addend & RL78_RELAXA_RNUM;
2245 /* At this point, we have an insn that is a candidate for linker
2246 relaxation. There are NRELOCS relocs following that may be
2247 relaxed, although each reloc may be made of more than one
2248 reloc entry (such as gp-rel symbols). */
2250 /* Get the value of the symbol referred to by the reloc. Just
2251 in case this is the last reloc in the list, use the RL's
2252 addend to choose between this reloc (no addend) or the next
2253 (yes addend, which means at least one following reloc). */
2255 /* srel points to the "current" reloction for this insn -
2256 actually the last reloc for a given operand, which is the one
2257 we need to update. We check the relaxations in the same
2258 order that the relocations happen, so we'll just push it
2262 pc = sec->output_section->vma + sec->output_offset
2266 BFD_ASSERT (nrelocs > 0); \
2267 symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \
2268 pcrel = symval - pc + srel->r_addend; \
2271 #define SNIPNR(offset, nbytes) \
2272 elf32_rl78_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0);
2274 #define SNIP(offset, nbytes, newtype) \
2275 SNIPNR (offset, nbytes); \
2276 srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2278 /* The order of these bit tests must match the order that the
2279 relocs appear in. Since we sorted those by offset, we can
2282 /*----------------------------------------------------------------------*/
2283 /* EF ad BR $rel8 pcrel
2284 ED al ah BR !abs16 abs
2285 EE al ah BR $!rel16 pcrel
2286 EC al ah as BR !!abs20 abs
2288 FD al ah CALL !abs16 abs
2289 FE al ah CALL $!rel16 pcrel
2290 FC al ah as CALL !!abs20 abs
2298 61 C8 EF ad SKC ; BR $rel8
2299 61 D8 EF ad SKNC ; BR $rel8
2300 61 E8 EF ad SKZ ; BR $rel8
2301 61 F8 EF ad SKNZ ; BR $rel8
2302 61 E3 EF ad SKH ; BR $rel8
2303 61 F3 EF ad SKNH ; BR $rel8
2306 if ((irel->r_addend & RL78_RELAXA_MASK) == RL78_RELAXA_BRA)
2308 /* SKIP opcodes that skip non-branches will have a relax tag
2309 but no corresponding symbol to relax against; we just
2311 if (irel->r_addend & RL78_RELAXA_RNUM)
2320 case 0xde: /* BNC */
2321 case 0xdf: /* BNZ */
2322 if (insn[1] == 0x03 && insn[2] == 0xee /* BR */
2323 && (srel->r_offset - irel->r_offset) > 1) /* a B<c> without its own reloc */
2325 /* This is a "long" conditional as generated by gas:
2330 insn[0] ^= 0x02; /* invert conditional */
2332 SNIP (1, 2, R_RL78_DIR8S_PCREL);
2339 case 0xec: /* BR !!abs20 */
2346 SNIP (2, 2, R_RL78_DIR8S_PCREL);
2349 else if (symval < 65536)
2352 insn[1] = symval & 0xff;
2353 insn[2] = symval >> 8;
2354 SNIP (2, 1, R_RL78_DIR16U);
2357 else if (pcrel < 32767
2361 insn[1] = pcrel & 0xff;
2362 insn[2] = pcrel >> 8;
2363 SNIP (2, 1, R_RL78_DIR16S_PCREL);
2368 case 0xee: /* BR $!pcrel16 */
2369 case 0xed: /* BR $!abs16 */
2375 SNIP (2, 1, R_RL78_DIR8S_PCREL);
2380 case 0xfc: /* CALL !!abs20 */
2384 insn[1] = symval & 0xff;
2385 insn[2] = symval >> 8;
2386 SNIP (2, 1, R_RL78_DIR16U);
2389 else if (pcrel < 32767
2393 insn[1] = pcrel & 0xff;
2394 insn[2] = pcrel >> 8;
2395 SNIP (2, 1, R_RL78_DIR16S_PCREL);
2400 case 0x61: /* PREFIX */
2401 /* For SKIP/BR, we change the BR opcode and delete the
2402 SKIP. That way, we don't have to find and change the
2403 relocation for the BR. */
2404 /* Note that, for the case where we're skipping some
2405 other insn, we have no "other" reloc but that's safe
2409 case 0xd3: /* BNH */
2411 if (insn[2] == 0x03 && insn[3] == 0xee
2412 && (srel->r_offset - irel->r_offset) > 2) /* a B<c> without its own reloc */
2414 /* Another long branch by gas:
2415 61 D3 03 EE ad.dr */
2419 insn[1] ^= 0x10; /* invert conditional */
2421 SNIP (2, 2, R_RL78_DIR8S_PCREL);
2428 case 0xc8: /* SKC */
2429 if (insn[2] == 0xef)
2431 insn[2] = 0xde; /* BNC */
2436 case 0xd8: /* SKNC */
2437 if (insn[2] == 0xef)
2439 insn[2] = 0xdc; /* BC */
2444 case 0xe8: /* SKZ */
2445 if (insn[2] == 0xef)
2447 insn[2] = 0xdf; /* BNZ */
2452 case 0xf8: /* SKNZ */
2453 if (insn[2] == 0xef)
2455 insn[2] = 0xdd; /* BZ */
2460 case 0xe3: /* SKH */
2461 if (insn[2] == 0xef)
2463 insn[2] = 0xd3; /* BNH */
2464 SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2468 case 0xf3: /* SKNH */
2469 if (insn[2] == 0xef)
2471 insn[2] = 0xc3; /* BH */
2472 SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2480 if ((irel->r_addend & RL78_RELAXA_MASK) == RL78_RELAXA_ADDR16
2483 /*----------------------------------------------------------------------*/
2484 /* Some insns have both a 16-bit address operand and an 8-bit
2485 variant if the address is within a special range:
2487 Address 16-bit operand SADDR range SFR range
2488 FFF00-FFFFF 0xff00-0xffff 0x00-0xff
2489 FFE20-FFF1F 0xfe20-0xff1f 0x00-0xff
2491 The RELAX_ADDR16[] array has the insn encodings for the
2492 16-bit operand version, as well as the SFR and SADDR
2493 variants. We only need to replace the encodings and
2496 Note: we intentionally do not attempt to decode and skip
2497 any ES: prefix, as adding ES: means the addr16 (likely)
2498 no longer points to saddr/sfr space.
2508 if (0xffe20 <= symval && symval <= 0xfffff)
2511 is_saddr = (0xffe20 <= symval && symval <= 0xfff1f);
2512 is_sfr = (0xfff00 <= symval && symval <= 0xfffff);
2514 for (idx = 0; relax_addr16[idx].insn != -1; idx ++)
2516 if (relax_addr16[idx].prefix != -1
2517 && insn[0] == relax_addr16[idx].prefix
2518 && insn[1] == relax_addr16[idx].insn)
2522 else if (relax_addr16[idx].prefix == -1
2523 && insn[0] == relax_addr16[idx].insn)
2530 /* We have a matched insn, and poff is 0 or 1 depending
2531 on the base pattern size. */
2533 if (is_sfr && relax_addr16[idx].insn_for_sfr != -1)
2535 insn[poff] = relax_addr16[idx].insn_for_sfr;
2536 SNIP (poff+2, 1, R_RL78_RH_SFR);
2539 else if (is_saddr && relax_addr16[idx].insn_for_saddr != -1)
2541 insn[poff] = relax_addr16[idx].insn_for_saddr;
2542 SNIP (poff+2, 1, R_RL78_RH_SADDR);
2547 /*----------------------------------------------------------------------*/
2553 if (free_relocs != NULL)
2556 if (free_contents != NULL)
2557 free (free_contents);
2559 if (shndx_buf != NULL)
2561 shndx_hdr->contents = NULL;
2565 if (free_intsyms != NULL)
2566 free (free_intsyms);
2573 #define ELF_ARCH bfd_arch_rl78
2574 #define ELF_MACHINE_CODE EM_RL78
2575 #define ELF_MAXPAGESIZE 0x1000
2577 #define TARGET_LITTLE_SYM rl78_elf32_vec
2578 #define TARGET_LITTLE_NAME "elf32-rl78"
2580 #define elf_info_to_howto_rel NULL
2581 #define elf_info_to_howto rl78_info_to_howto_rela
2582 #define elf_backend_object_p rl78_elf_object_p
2583 #define elf_backend_relocate_section rl78_elf_relocate_section
2584 #define elf_symbol_leading_char ('_')
2585 #define elf_backend_can_gc_sections 1
2587 #define bfd_elf32_bfd_reloc_type_lookup rl78_reloc_type_lookup
2588 #define bfd_elf32_bfd_reloc_name_lookup rl78_reloc_name_lookup
2589 #define bfd_elf32_bfd_set_private_flags rl78_elf_set_private_flags
2590 #define bfd_elf32_bfd_merge_private_bfd_data rl78_elf_merge_private_bfd_data
2591 #define bfd_elf32_bfd_print_private_bfd_data rl78_elf_print_private_bfd_data
2593 #define bfd_elf32_bfd_relax_section rl78_elf_relax_section
2594 #define elf_backend_check_relocs rl78_elf_check_relocs
2595 #define elf_backend_always_size_sections \
2596 rl78_elf_always_size_sections
2597 #define elf_backend_finish_dynamic_sections \
2598 rl78_elf_finish_dynamic_sections
2600 #include "elf32-target.h"