1 /* Renesas RL78 specific support for 32-bit ELF.
2 Copyright (C) 2011-2016 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 #include "bfd_stdint.h"
26 #include "libiberty.h"
28 #define valid_16bit_address(v) ((v) <= 0x0ffff || (v) >= 0xf0000)
30 #define RL78REL(n,sz,bit,shift,complain,pcrel) \
31 HOWTO (R_RL78_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
32 bfd_elf_generic_reloc, "R_RL78_" #n, FALSE, 0, ~0, FALSE)
34 static bfd_reloc_status_type rl78_special_reloc (bfd *, arelent *, asymbol *, void *,
35 asection *, bfd *, char **);
37 /* FIXME: We could omit the SHIFT parameter, it is always zero. */
38 #define RL78_OP_REL(n,sz,bit,shift,complain,pcrel) \
39 HOWTO (R_RL78_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
40 rl78_special_reloc, "R_RL78_" #n, FALSE, 0, ~0, FALSE)
42 /* Note that the relocations around 0x7f are internal to this file;
43 feel free to move them as needed to avoid conflicts with published
44 relocation numbers. */
46 static reloc_howto_type rl78_elf_howto_table [] =
48 RL78REL (NONE, 3, 0, 0, dont, FALSE),
49 RL78REL (DIR32, 2, 32, 0, signed, FALSE),
50 RL78REL (DIR24S, 2, 24, 0, signed, FALSE),
51 RL78REL (DIR16, 1, 16, 0, dont, FALSE),
52 RL78REL (DIR16U, 1, 16, 0, unsigned, FALSE),
53 RL78REL (DIR16S, 1, 16, 0, signed, FALSE),
54 RL78REL (DIR8, 0, 8, 0, dont, FALSE),
55 RL78REL (DIR8U, 0, 8, 0, unsigned, FALSE),
56 RL78REL (DIR8S, 0, 8, 0, signed, FALSE),
57 RL78REL (DIR24S_PCREL, 2, 24, 0, signed, TRUE),
58 RL78REL (DIR16S_PCREL, 1, 16, 0, signed, TRUE),
59 RL78REL (DIR8S_PCREL, 0, 8, 0, signed, TRUE),
60 RL78REL (DIR16UL, 1, 16, 2, unsigned, FALSE),
61 RL78REL (DIR16UW, 1, 16, 1, unsigned, FALSE),
62 RL78REL (DIR8UL, 0, 8, 2, unsigned, FALSE),
63 RL78REL (DIR8UW, 0, 8, 1, unsigned, FALSE),
64 RL78REL (DIR32_REV, 1, 16, 0, dont, FALSE),
65 RL78REL (DIR16_REV, 1, 16, 0, dont, FALSE),
66 RL78REL (DIR3U_PCREL, 0, 3, 0, dont, TRUE),
95 RL78REL (RH_RELAX, 0, 0, 0, dont, FALSE),
98 RL78REL (RH_SADDR, 0, 0, 0, dont, FALSE),
117 RL78_OP_REL (ABS32, 2, 32, 0, dont, FALSE),
118 RL78_OP_REL (ABS24S, 2, 24, 0, signed, FALSE),
119 RL78_OP_REL (ABS16, 1, 16, 0, dont, FALSE),
120 RL78_OP_REL (ABS16U, 1, 16, 0, unsigned, FALSE),
121 RL78_OP_REL (ABS16S, 1, 16, 0, signed, FALSE),
122 RL78_OP_REL (ABS8, 0, 8, 0, dont, FALSE),
123 RL78_OP_REL (ABS8U, 0, 8, 0, unsigned, FALSE),
124 RL78_OP_REL (ABS8S, 0, 8, 0, signed, FALSE),
125 RL78_OP_REL (ABS24S_PCREL, 2, 24, 0, signed, TRUE),
126 RL78_OP_REL (ABS16S_PCREL, 1, 16, 0, signed, TRUE),
127 RL78_OP_REL (ABS8S_PCREL, 0, 8, 0, signed, TRUE),
128 RL78_OP_REL (ABS16UL, 1, 16, 0, unsigned, FALSE),
129 RL78_OP_REL (ABS16UW, 1, 16, 0, unsigned, FALSE),
130 RL78_OP_REL (ABS8UL, 0, 8, 0, unsigned, FALSE),
131 RL78_OP_REL (ABS8UW, 0, 8, 0, unsigned, FALSE),
132 RL78_OP_REL (ABS32_REV, 2, 32, 0, dont, FALSE),
133 RL78_OP_REL (ABS16_REV, 1, 16, 0, dont, FALSE),
135 #define STACK_REL_P(x) ((x) <= R_RL78_ABS16_REV && (x) >= R_RL78_ABS32)
185 RL78_OP_REL (SYM, 2, 32, 0, dont, FALSE),
186 RL78_OP_REL (OPneg, 2, 32, 0, dont, FALSE),
187 RL78_OP_REL (OPadd, 2, 32, 0, dont, FALSE),
188 RL78_OP_REL (OPsub, 2, 32, 0, dont, FALSE),
189 RL78_OP_REL (OPmul, 2, 32, 0, dont, FALSE),
190 RL78_OP_REL (OPdiv, 2, 32, 0, dont, FALSE),
191 RL78_OP_REL (OPshla, 2, 32, 0, dont, FALSE),
192 RL78_OP_REL (OPshra, 2, 32, 0, dont, FALSE),
193 RL78_OP_REL (OPsctsize, 2, 32, 0, dont, FALSE),
198 RL78_OP_REL (OPscttop, 2, 32, 0, dont, FALSE),
201 RL78_OP_REL (OPand, 2, 32, 0, dont, FALSE),
202 RL78_OP_REL (OPor, 2, 32, 0, dont, FALSE),
203 RL78_OP_REL (OPxor, 2, 32, 0, dont, FALSE),
204 RL78_OP_REL (OPnot, 2, 32, 0, dont, FALSE),
205 RL78_OP_REL (OPmod, 2, 32, 0, dont, FALSE),
206 RL78_OP_REL (OPromtop, 2, 32, 0, dont, FALSE),
207 RL78_OP_REL (OPramtop, 2, 32, 0, dont, FALSE)
210 /* Map BFD reloc types to RL78 ELF reloc types. */
212 struct rl78_reloc_map
214 bfd_reloc_code_real_type bfd_reloc_val;
215 unsigned int rl78_reloc_val;
218 static const struct rl78_reloc_map rl78_reloc_map [] =
220 { BFD_RELOC_NONE, R_RL78_NONE },
221 { BFD_RELOC_8, R_RL78_DIR8S },
222 { BFD_RELOC_16, R_RL78_DIR16S },
223 { BFD_RELOC_24, R_RL78_DIR24S },
224 { BFD_RELOC_32, R_RL78_DIR32 },
225 { BFD_RELOC_RL78_16_OP, R_RL78_DIR16 },
226 { BFD_RELOC_RL78_DIR3U_PCREL, R_RL78_DIR3U_PCREL },
227 { BFD_RELOC_8_PCREL, R_RL78_DIR8S_PCREL },
228 { BFD_RELOC_16_PCREL, R_RL78_DIR16S_PCREL },
229 { BFD_RELOC_24_PCREL, R_RL78_DIR24S_PCREL },
230 { BFD_RELOC_RL78_8U, R_RL78_DIR8U },
231 { BFD_RELOC_RL78_16U, R_RL78_DIR16U },
232 { BFD_RELOC_RL78_SYM, R_RL78_SYM },
233 { BFD_RELOC_RL78_OP_SUBTRACT, R_RL78_OPsub },
234 { BFD_RELOC_RL78_OP_NEG, R_RL78_OPneg },
235 { BFD_RELOC_RL78_OP_AND, R_RL78_OPand },
236 { BFD_RELOC_RL78_OP_SHRA, R_RL78_OPshra },
237 { BFD_RELOC_RL78_ABS8, R_RL78_ABS8 },
238 { BFD_RELOC_RL78_ABS16, R_RL78_ABS16 },
239 { BFD_RELOC_RL78_ABS16_REV, R_RL78_ABS16_REV },
240 { BFD_RELOC_RL78_ABS32, R_RL78_ABS32 },
241 { BFD_RELOC_RL78_ABS32_REV, R_RL78_ABS32_REV },
242 { BFD_RELOC_RL78_ABS16UL, R_RL78_ABS16UL },
243 { BFD_RELOC_RL78_ABS16UW, R_RL78_ABS16UW },
244 { BFD_RELOC_RL78_ABS16U, R_RL78_ABS16U },
245 { BFD_RELOC_RL78_SADDR, R_RL78_RH_SADDR },
246 { BFD_RELOC_RL78_RELAX, R_RL78_RH_RELAX }
249 static reloc_howto_type *
250 rl78_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
251 bfd_reloc_code_real_type code)
255 if (code == BFD_RELOC_RL78_32_OP)
256 return rl78_elf_howto_table + R_RL78_DIR32;
258 for (i = ARRAY_SIZE (rl78_reloc_map); i--;)
259 if (rl78_reloc_map [i].bfd_reloc_val == code)
260 return rl78_elf_howto_table + rl78_reloc_map[i].rl78_reloc_val;
265 static reloc_howto_type *
266 rl78_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED, const char * r_name)
270 for (i = 0; i < ARRAY_SIZE (rl78_elf_howto_table); i++)
271 if (rl78_elf_howto_table[i].name != NULL
272 && strcasecmp (rl78_elf_howto_table[i].name, r_name) == 0)
273 return rl78_elf_howto_table + i;
278 /* Set the howto pointer for an RL78 ELF reloc. */
281 rl78_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
283 Elf_Internal_Rela * dst)
287 r_type = ELF32_R_TYPE (dst->r_info);
288 if (r_type >= (unsigned int) R_RL78_max)
290 _bfd_error_handler (_("%B: invalid RL78 reloc number: %d"), abfd, r_type);
293 cache_ptr->howto = rl78_elf_howto_table + r_type;
297 get_symbol_value (const char * name,
298 struct bfd_link_info * info,
300 asection * input_section,
303 struct bfd_link_hash_entry * h;
308 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
311 || (h->type != bfd_link_hash_defined
312 && h->type != bfd_link_hash_defweak))
314 (*info->callbacks->undefined_symbol)
315 (info, name, input_bfd, input_section, offset, TRUE);
319 return (h->u.def.value
320 + h->u.def.section->output_section->vma
321 + h->u.def.section->output_offset);
325 get_romstart (struct bfd_link_info * info,
330 static bfd_boolean cached = FALSE;
331 static bfd_vma cached_value = 0;
335 cached_value = get_symbol_value ("_start", info, abfd, sec, offset);
342 get_ramstart (struct bfd_link_info * info,
347 static bfd_boolean cached = FALSE;
348 static bfd_vma cached_value = 0;
352 cached_value = get_symbol_value ("__datastart", info, abfd, sec, offset);
358 #define NUM_STACK_ENTRIES 16
359 static int32_t rl78_stack [ NUM_STACK_ENTRIES ];
360 static unsigned int rl78_stack_top;
362 #define RL78_STACK_PUSH(val) \
365 if (rl78_stack_top < NUM_STACK_ENTRIES) \
366 rl78_stack [rl78_stack_top ++] = (val); \
368 _bfd_error_handler (_("Internal Error: RL78 reloc stack overflow")); \
372 #define RL78_STACK_POP(dest) \
375 if (rl78_stack_top > 0) \
376 (dest) = rl78_stack [-- rl78_stack_top];\
379 _bfd_error_handler (_("Internal Error: RL78 reloc stack underflow")); \
385 /* Special handling for RL78 complex relocs. Returns the
386 value of the reloc, or 0 for relocs which do not generate
387 a result. SYMVAL is the value of the symbol for relocs
388 which use a symbolic argument. */
391 rl78_compute_complex_reloc (unsigned long r_type,
393 asection * input_section)
403 case R_RL78_ABS24S_PCREL:
404 case R_RL78_ABS16S_PCREL:
405 case R_RL78_ABS8S_PCREL:
406 RL78_STACK_POP (relocation);
407 relocation -= input_section->output_section->vma + input_section->output_offset;
411 case R_RL78_ABS32_REV:
413 case R_RL78_ABS16_REV:
419 RL78_STACK_POP (relocation);
424 RL78_STACK_POP (relocation);
425 return relocation >> 2;
429 RL78_STACK_POP (relocation);
430 return relocation >> 1;
432 /* The rest of the relocs compute values and then push them onto the stack. */
433 case R_RL78_OPramtop:
434 case R_RL78_OPromtop:
436 RL78_STACK_PUSH (symval);
440 RL78_STACK_POP (tmp1);
442 RL78_STACK_PUSH (tmp1);
446 RL78_STACK_POP (tmp2);
447 RL78_STACK_POP (tmp1);
449 RL78_STACK_PUSH (tmp1);
453 /* For the expression "A - B", the assembler pushes A,
454 then B, then OPSUB. So the first op we pop is B, not A. */
455 RL78_STACK_POP (tmp2); /* B */
456 RL78_STACK_POP (tmp1); /* A */
457 tmp1 -= tmp2; /* A - B */
458 RL78_STACK_PUSH (tmp1);
462 RL78_STACK_POP (tmp2);
463 RL78_STACK_POP (tmp1);
465 RL78_STACK_PUSH (tmp1);
469 RL78_STACK_POP (tmp2);
470 RL78_STACK_POP (tmp1);
472 RL78_STACK_PUSH (tmp1);
476 RL78_STACK_POP (tmp2);
477 RL78_STACK_POP (tmp1);
479 RL78_STACK_PUSH (tmp1);
483 RL78_STACK_POP (tmp2);
484 RL78_STACK_POP (tmp1);
486 RL78_STACK_PUSH (tmp1);
489 case R_RL78_OPsctsize:
490 RL78_STACK_PUSH (input_section->size);
493 case R_RL78_OPscttop:
494 RL78_STACK_PUSH (input_section->output_section->vma);
498 RL78_STACK_POP (tmp2);
499 RL78_STACK_POP (tmp1);
501 RL78_STACK_PUSH (tmp1);
505 RL78_STACK_POP (tmp2);
506 RL78_STACK_POP (tmp1);
508 RL78_STACK_PUSH (tmp1);
512 RL78_STACK_POP (tmp2);
513 RL78_STACK_POP (tmp1);
515 RL78_STACK_PUSH (tmp1);
519 RL78_STACK_POP (tmp1);
521 RL78_STACK_PUSH (tmp1);
525 RL78_STACK_POP (tmp2);
526 RL78_STACK_POP (tmp1);
528 RL78_STACK_PUSH (tmp1);
533 #undef RL78_STACK_PUSH
534 #undef RL78_STACK_POP
536 #define OP(i) (contents[reloc->address + (i)])
538 static bfd_reloc_status_type
539 rl78_special_reloc (bfd * input_bfd,
543 asection * input_section,
544 bfd * output_bfd ATTRIBUTE_UNUSED,
545 char ** error_message ATTRIBUTE_UNUSED)
547 bfd_reloc_status_type r = bfd_reloc_ok;
548 bfd_vma relocation = 0;
549 unsigned long r_type = reloc->howto->type;
550 bfd_byte * contents = data;
552 /* If necessary, compute the symbolic value of the relocation. */
556 relocation = (symbol->value
557 + symbol->section->output_section->vma
558 + symbol->section->output_offset
562 case R_RL78_OPromtop:
563 relocation = get_romstart (NULL, input_bfd, input_section,
567 case R_RL78_OPramtop:
568 relocation = get_ramstart (NULL, input_bfd, input_section,
573 /* Get the value of the relocation. */
574 relocation = rl78_compute_complex_reloc (r_type, relocation, input_section);
576 /* If the relocation alters the contents of the section then apply it now.
577 Note - since this function is called from
578 bfd_generic_get_relocated_section_contents via bfd_perform_relocation,
579 and not from the linker, we do not perform any range checking. The
580 clients who are calling us are only interested in some relocated section
581 contents, and not any linkage problems that might occur later. */
586 OP (1) = relocation >> 8;
587 OP (2) = relocation >> 16;
588 OP (3) = relocation >> 24;
591 case R_RL78_ABS32_REV:
593 OP (2) = relocation >> 8;
594 OP (1) = relocation >> 16;
595 OP (0) = relocation >> 24;
598 case R_RL78_ABS24S_PCREL:
601 OP (1) = relocation >> 8;
602 OP (2) = relocation >> 16;
605 case R_RL78_ABS16_REV:
607 OP (0) = relocation >> 8;
610 case R_RL78_ABS16S_PCREL:
617 OP (1) = relocation >> 8;
620 case R_RL78_ABS8S_PCREL:
637 #define OP(i) (contents[rel->r_offset + (i)])
639 /* Relocate an RL78 ELF section.
640 There is some attempt to make this function usable for many architectures,
641 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
642 if only to serve as a learning tool.
644 The RELOCATE_SECTION function is called by the new ELF backend linker
645 to handle the relocations for a section.
647 The relocs are always passed as Rela structures; if the section
648 actually uses Rel structures, the r_addend field will always be
651 This function is responsible for adjusting the section contents as
652 necessary, and (if using Rela relocs and generating a relocatable
653 output file) adjusting the reloc addend as necessary.
655 This function does not have to worry about setting the reloc
656 address or the reloc symbol index.
658 LOCAL_SYMS is a pointer to the swapped in local symbols.
660 LOCAL_SECTIONS is an array giving the section in the input file
661 corresponding to the st_shndx field of each local symbol.
663 The global hash table entry for the global symbols can be found
664 via elf_sym_hashes (input_bfd).
666 When generating relocatable output, this function must handle
667 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
668 going to be the section symbol corresponding to the output
669 section, which means that the addend must be adjusted
673 rl78_elf_relocate_section
675 struct bfd_link_info * info,
677 asection * input_section,
679 Elf_Internal_Rela * relocs,
680 Elf_Internal_Sym * local_syms,
681 asection ** local_sections)
683 Elf_Internal_Shdr * symtab_hdr;
684 struct elf_link_hash_entry ** sym_hashes;
685 Elf_Internal_Rela * rel;
686 Elf_Internal_Rela * relend;
690 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
691 sym_hashes = elf_sym_hashes (input_bfd);
692 relend = relocs + input_section->reloc_count;
694 dynobj = elf_hash_table (info)->dynobj;
697 splt = bfd_get_linker_section (dynobj, ".plt");
699 for (rel = relocs; rel < relend; rel ++)
701 reloc_howto_type * howto;
702 unsigned long r_symndx;
703 Elf_Internal_Sym * sym;
705 struct elf_link_hash_entry * h;
707 bfd_reloc_status_type r;
708 const char * name = NULL;
709 bfd_boolean unresolved_reloc = TRUE;
712 r_type = ELF32_R_TYPE (rel->r_info);
713 r_symndx = ELF32_R_SYM (rel->r_info);
715 howto = rl78_elf_howto_table + ELF32_R_TYPE (rel->r_info);
721 if (r_symndx < symtab_hdr->sh_info)
723 sym = local_syms + r_symndx;
724 sec = local_sections [r_symndx];
725 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, & sec, rel);
727 name = bfd_elf_string_from_elf_section
728 (input_bfd, symtab_hdr->sh_link, sym->st_name);
729 name = (sym->st_name == 0) ? bfd_section_name (input_bfd, sec) : name;
733 bfd_boolean warned ATTRIBUTE_UNUSED;
734 bfd_boolean ignored ATTRIBUTE_UNUSED;
736 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
737 r_symndx, symtab_hdr, sym_hashes, h,
738 sec, relocation, unresolved_reloc,
741 name = h->root.root.string;
744 if (sec != NULL && discarded_section (sec))
745 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
746 rel, 1, relend, howto, 0, contents);
748 if (bfd_link_relocatable (info))
750 /* This is a relocatable link. We don't have to change
751 anything, unless the reloc is against a section symbol,
752 in which case we have to adjust according to where the
753 section symbol winds up in the output section. */
754 if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
755 rel->r_addend += sec->output_offset;
759 switch (ELF32_R_TYPE (rel->r_info))
766 plt_offset = &h->plt.offset;
768 plt_offset = elf_local_got_offsets (input_bfd) + r_symndx;
770 if (! valid_16bit_address (relocation))
772 /* If this is the first time we've processed this symbol,
773 fill in the plt entry with the correct symbol address. */
774 if ((*plt_offset & 1) == 0)
778 x = 0x000000ec; /* br !!abs24 */
779 x |= (relocation << 8) & 0xffffff00;
780 bfd_put_32 (input_bfd, x, splt->contents + *plt_offset);
784 relocation = (splt->output_section->vma
785 + splt->output_offset
786 + (*plt_offset & -2));
789 char *newname = bfd_malloc (strlen(name)+5);
790 strcpy (newname, name);
791 strcat(newname, ".plt");
792 _bfd_generic_link_add_one_symbol (info,
795 BSF_FUNCTION | BSF_WEAK,
808 if (h != NULL && h->root.type == bfd_link_hash_undefweak)
809 /* If the symbol is undefined and weak
810 then the relocation resolves to zero. */
814 if (howto->pc_relative)
816 relocation -= (input_section->output_section->vma
817 + input_section->output_offset
819 relocation -= bfd_get_reloc_size (howto);
822 relocation += rel->r_addend;
827 #define RANGE(a,b) if (a > (long) relocation || (long) relocation > b) r = bfd_reloc_overflow
829 /* Opcode relocs are always big endian. Data relocs are bi-endian. */
835 case R_RL78_RH_RELAX:
838 case R_RL78_DIR8S_PCREL:
853 case R_RL78_DIR16S_PCREL:
854 RANGE (-32768, 32767);
856 OP (1) = relocation >> 8;
860 if ((relocation & 0xf0000) == 0xf0000)
861 relocation &= 0xffff;
862 RANGE (-32768, 65535);
864 OP (1) = relocation >> 8;
870 OP (1) = relocation >> 8;
874 RANGE (-32768, 65536);
876 OP (1) = relocation >> 8;
879 case R_RL78_DIR16_REV:
880 RANGE (-32768, 65536);
882 OP (0) = relocation >> 8;
885 case R_RL78_DIR3U_PCREL:
888 OP (0) |= relocation & 0x07;
891 case R_RL78_DIR24S_PCREL:
892 RANGE (-0x800000, 0x7fffff);
894 OP (1) = relocation >> 8;
895 OP (2) = relocation >> 16;
899 RANGE (-0x800000, 0x7fffff);
901 OP (1) = relocation >> 8;
902 OP (2) = relocation >> 16;
907 OP (1) = relocation >> 8;
908 OP (2) = relocation >> 16;
909 OP (3) = relocation >> 24;
912 case R_RL78_DIR32_REV:
914 OP (2) = relocation >> 8;
915 OP (1) = relocation >> 16;
916 OP (0) = relocation >> 24;
920 RANGE (0xfff00, 0xfffff);
921 OP (0) = relocation & 0xff;
924 case R_RL78_RH_SADDR:
925 RANGE (0xffe20, 0xfff1f);
926 OP (0) = relocation & 0xff;
929 /* Complex reloc handling: */
931 case R_RL78_ABS32_REV:
932 case R_RL78_ABS24S_PCREL:
935 case R_RL78_ABS16_REV:
936 case R_RL78_ABS16S_PCREL:
945 case R_RL78_ABS8S_PCREL:
954 case R_RL78_OPsctsize:
955 case R_RL78_OPscttop:
961 relocation = rl78_compute_complex_reloc (r_type, 0, input_section);
967 OP (1) = relocation >> 8;
968 OP (2) = relocation >> 16;
969 OP (3) = relocation >> 24;
972 case R_RL78_ABS32_REV:
974 OP (2) = relocation >> 8;
975 OP (1) = relocation >> 16;
976 OP (0) = relocation >> 24;
979 case R_RL78_ABS24S_PCREL:
981 RANGE (-0x800000, 0x7fffff);
983 OP (1) = relocation >> 8;
984 OP (2) = relocation >> 16;
988 RANGE (-32768, 65535);
990 OP (1) = relocation >> 8;
993 case R_RL78_ABS16_REV:
994 RANGE (-32768, 65535);
996 OP (0) = relocation >> 8;
999 case R_RL78_ABS16S_PCREL:
1001 RANGE (-32768, 32767);
1002 OP (0) = relocation;
1003 OP (1) = relocation >> 8;
1007 case R_RL78_ABS16UL:
1008 case R_RL78_ABS16UW:
1010 OP (0) = relocation;
1011 OP (1) = relocation >> 8;
1016 OP (0) = relocation;
1023 OP (0) = relocation;
1026 case R_RL78_ABS8S_PCREL:
1029 OP (0) = relocation;
1038 if (r_symndx < symtab_hdr->sh_info)
1039 relocation = sec->output_section->vma + sec->output_offset
1040 + sym->st_value + rel->r_addend;
1042 && (h->root.type == bfd_link_hash_defined
1043 || h->root.type == bfd_link_hash_defweak))
1044 relocation = h->root.u.def.value
1045 + sec->output_section->vma
1046 + sec->output_offset
1051 if (h->root.type != bfd_link_hash_undefweak)
1052 _bfd_error_handler (_("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 msg = _("%B(%A): error: call to undefined function '%s'");
1084 (*info->callbacks->reloc_overflow)
1085 (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
1086 input_bfd, input_section, rel->r_offset);
1089 case bfd_reloc_undefined:
1090 (*info->callbacks->undefined_symbol)
1091 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1094 case bfd_reloc_other:
1095 msg = _("%B(%A): warning: unaligned access to symbol '%s' in the small data area");
1098 case bfd_reloc_outofrange:
1099 msg = _("%B(%A): internal error: out of range error");
1102 case bfd_reloc_notsupported:
1103 msg = _("%B(%A): internal error: unsupported relocation error");
1106 case bfd_reloc_dangerous:
1107 msg = _("%B(%A): internal error: dangerous relocation");
1111 msg = _("%B(%A): internal error: unknown error");
1116 _bfd_error_handler (msg, input_bfd, input_section, name);
1123 /* Function to set the ELF flag bits. */
1126 rl78_elf_set_private_flags (bfd * abfd, flagword flags)
1128 elf_elfheader (abfd)->e_flags = flags;
1129 elf_flags_init (abfd) = TRUE;
1133 static bfd_boolean no_warn_mismatch = FALSE;
1135 void bfd_elf32_rl78_set_target_flags (bfd_boolean);
1138 bfd_elf32_rl78_set_target_flags (bfd_boolean user_no_warn_mismatch)
1140 no_warn_mismatch = user_no_warn_mismatch;
1144 rl78_cpu_name (flagword flags)
1146 switch (flags & E_FLAG_RL78_CPU_MASK)
1149 case E_FLAG_RL78_G10: return "G10";
1150 case E_FLAG_RL78_G13: return "G13";
1151 case E_FLAG_RL78_G14: return "G14";
1155 /* Merge backend specific data from an object file to the output
1156 object file when linking. */
1159 rl78_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
1163 bfd_boolean error = FALSE;
1165 new_flags = elf_elfheader (ibfd)->e_flags;
1166 old_flags = elf_elfheader (obfd)->e_flags;
1168 if (!elf_flags_init (obfd))
1170 /* First call, no flags set. */
1171 elf_flags_init (obfd) = TRUE;
1172 elf_elfheader (obfd)->e_flags = new_flags;
1174 else if (old_flags != new_flags)
1176 flagword changed_flags = old_flags ^ new_flags;
1178 if (changed_flags & E_FLAG_RL78_CPU_MASK)
1180 flagword out_cpu = old_flags & E_FLAG_RL78_CPU_MASK;
1181 flagword in_cpu = new_flags & E_FLAG_RL78_CPU_MASK;
1183 if (in_cpu == E_FLAG_RL78_ANY_CPU || in_cpu == out_cpu)
1184 /* It does not matter what new_cpu may have. */;
1185 else if (out_cpu == E_FLAG_RL78_ANY_CPU)
1187 if (in_cpu == E_FLAG_RL78_G10)
1189 /* G10 files can only be linked with other G10 files.
1190 If the output is set to "any" this means that it is
1191 a G14 file that does not use hardware multiply/divide,
1192 but that is still incompatible with the G10 ABI. */
1196 (_("RL78 ABI conflict: G10 file %s cannot be linked with %s file %s"),
1197 bfd_get_filename (ibfd),
1198 rl78_cpu_name (out_cpu), bfd_get_filename (obfd));
1202 old_flags &= ~ E_FLAG_RL78_CPU_MASK;
1203 old_flags |= in_cpu;
1204 elf_elfheader (obfd)->e_flags = old_flags;
1212 (_("RL78 ABI conflict: cannot link %s file %s with %s file %s"),
1213 rl78_cpu_name (in_cpu), bfd_get_filename (ibfd),
1214 rl78_cpu_name (out_cpu), bfd_get_filename (obfd));
1218 if (changed_flags & E_FLAG_RL78_64BIT_DOUBLES)
1221 (_("RL78 merge conflict: cannot link 32-bit and 64-bit objects together"));
1223 if (old_flags & E_FLAG_RL78_64BIT_DOUBLES)
1224 _bfd_error_handler (_("- %s is 64-bit, %s is not"),
1225 bfd_get_filename (obfd), bfd_get_filename (ibfd));
1227 _bfd_error_handler (_("- %s is 64-bit, %s is not"),
1228 bfd_get_filename (ibfd), bfd_get_filename (obfd));
1237 rl78_elf_print_private_bfd_data (bfd * abfd, void * ptr)
1239 FILE * file = (FILE *) ptr;
1242 BFD_ASSERT (abfd != NULL && ptr != NULL);
1244 /* Print normal ELF private data. */
1245 _bfd_elf_print_private_bfd_data (abfd, ptr);
1247 flags = elf_elfheader (abfd)->e_flags;
1248 fprintf (file, _("private flags = 0x%lx:"), (long) flags);
1250 if (flags & E_FLAG_RL78_CPU_MASK)
1251 fprintf (file, " [%s]", rl78_cpu_name (flags));
1253 if (flags & E_FLAG_RL78_64BIT_DOUBLES)
1254 fprintf (file, _(" [64-bit doubles]"));
1260 /* Return the MACH for an e_flags value. */
1263 elf32_rl78_machine (bfd * abfd ATTRIBUTE_UNUSED)
1265 return bfd_mach_rl78;
1269 rl78_elf_object_p (bfd * abfd)
1271 bfd_default_set_arch_mach (abfd, bfd_arch_rl78,
1272 elf32_rl78_machine (abfd));
1276 /* support PLT for 16-bit references to 24-bit functions. */
1278 /* We support 16-bit pointers to code above 64k by generating a thunk
1279 below 64k containing a JMP instruction to the final address. */
1282 rl78_elf_check_relocs
1284 struct bfd_link_info * info,
1286 const Elf_Internal_Rela * relocs)
1288 Elf_Internal_Shdr * symtab_hdr;
1289 struct elf_link_hash_entry ** sym_hashes;
1290 const Elf_Internal_Rela * rel;
1291 const Elf_Internal_Rela * rel_end;
1292 bfd_vma *local_plt_offsets;
1296 if (bfd_link_relocatable (info))
1299 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1300 sym_hashes = elf_sym_hashes (abfd);
1301 local_plt_offsets = elf_local_got_offsets (abfd);
1303 dynobj = elf_hash_table(info)->dynobj;
1305 rel_end = relocs + sec->reloc_count;
1306 for (rel = relocs; rel < rel_end; rel++)
1308 struct elf_link_hash_entry *h;
1309 unsigned long r_symndx;
1312 r_symndx = ELF32_R_SYM (rel->r_info);
1313 if (r_symndx < symtab_hdr->sh_info)
1317 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1318 while (h->root.type == bfd_link_hash_indirect
1319 || h->root.type == bfd_link_hash_warning)
1320 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1322 /* PR15323, ref flags aren't set for references in the same
1324 h->root.non_ir_ref = 1;
1327 switch (ELF32_R_TYPE (rel->r_info))
1329 /* This relocation describes a 16-bit pointer to a function.
1330 We may need to allocate a thunk in low memory; reserve memory
1334 elf_hash_table (info)->dynobj = dynobj = abfd;
1337 splt = bfd_get_linker_section (dynobj, ".plt");
1340 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1341 | SEC_IN_MEMORY | SEC_LINKER_CREATED
1342 | SEC_READONLY | SEC_CODE);
1343 splt = bfd_make_section_anyway_with_flags (dynobj, ".plt",
1346 || ! bfd_set_section_alignment (dynobj, splt, 1))
1352 offset = &h->plt.offset;
1355 if (local_plt_offsets == NULL)
1360 size = symtab_hdr->sh_info * sizeof (bfd_vma);
1361 local_plt_offsets = (bfd_vma *) bfd_alloc (abfd, size);
1362 if (local_plt_offsets == NULL)
1364 elf_local_got_offsets (abfd) = local_plt_offsets;
1366 for (i = 0; i < symtab_hdr->sh_info; i++)
1367 local_plt_offsets[i] = (bfd_vma) -1;
1369 offset = &local_plt_offsets[r_symndx];
1372 if (*offset == (bfd_vma) -1)
1374 *offset = splt->size;
1384 /* This must exist if dynobj is ever set. */
1387 rl78_elf_finish_dynamic_sections (bfd *abfd ATTRIBUTE_UNUSED,
1388 struct bfd_link_info *info)
1393 if (!elf_hash_table (info)->dynamic_sections_created)
1396 /* As an extra sanity check, verify that all plt entries have been
1397 filled in. However, relaxing might have changed the relocs so
1398 that some plt entries don't get filled in, so we have to skip
1399 this check if we're relaxing. Unfortunately, check_relocs is
1400 called before relaxation. */
1402 if (info->relax_trip > 0)
1405 if ((dynobj = elf_hash_table (info)->dynobj) != NULL
1406 && (splt = bfd_get_linker_section (dynobj, ".plt")) != NULL)
1408 bfd_byte *contents = splt->contents;
1409 unsigned int i, size = splt->size;
1411 for (i = 0; i < size; i += 4)
1413 unsigned int x = bfd_get_32 (dynobj, contents + i);
1414 BFD_ASSERT (x != 0);
1422 rl78_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1423 struct bfd_link_info *info)
1428 if (bfd_link_relocatable (info))
1431 dynobj = elf_hash_table (info)->dynobj;
1435 splt = bfd_get_linker_section (dynobj, ".plt");
1436 BFD_ASSERT (splt != NULL);
1438 splt->contents = (bfd_byte *) bfd_zalloc (dynobj, splt->size);
1439 if (splt->contents == NULL)
1447 /* Handle relaxing. */
1449 /* A subroutine of rl78_elf_relax_section. If the global symbol H
1450 is within the low 64k, remove any entry for it in the plt. */
1452 struct relax_plt_data
1459 rl78_relax_plt_check (struct elf_link_hash_entry *h, void * xdata)
1461 struct relax_plt_data *data = (struct relax_plt_data *) xdata;
1463 if (h->plt.offset != (bfd_vma) -1)
1467 if (h->root.type == bfd_link_hash_undefined
1468 || h->root.type == bfd_link_hash_undefweak)
1471 address = (h->root.u.def.section->output_section->vma
1472 + h->root.u.def.section->output_offset
1473 + h->root.u.def.value);
1475 if (valid_16bit_address (address))
1478 data->splt->size -= 4;
1479 *data->again = TRUE;
1486 /* A subroutine of rl78_elf_relax_section. If the global symbol H
1487 previously had a plt entry, give it a new entry offset. */
1490 rl78_relax_plt_realloc (struct elf_link_hash_entry *h, void * xdata)
1492 bfd_vma *entry = (bfd_vma *) xdata;
1494 if (h->plt.offset != (bfd_vma) -1)
1496 h->plt.offset = *entry;
1504 rl78_elf_relax_plt_section (bfd *dynobj,
1506 struct bfd_link_info *info,
1509 struct relax_plt_data relax_plt_data;
1512 /* Assume nothing changes. */
1515 if (bfd_link_relocatable (info))
1518 /* We only relax the .plt section at the moment. */
1519 if (dynobj != elf_hash_table (info)->dynobj
1520 || strcmp (splt->name, ".plt") != 0)
1523 /* Quick check for an empty plt. */
1524 if (splt->size == 0)
1527 /* Map across all global symbols; see which ones happen to
1528 fall in the low 64k. */
1529 relax_plt_data.splt = splt;
1530 relax_plt_data.again = again;
1531 elf_link_hash_traverse (elf_hash_table (info), rl78_relax_plt_check,
1534 /* Likewise for local symbols, though that's somewhat less convenient
1535 as we have to walk the list of input bfds and swap in symbol data. */
1536 for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1538 bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1539 Elf_Internal_Shdr *symtab_hdr;
1540 Elf_Internal_Sym *isymbuf = NULL;
1543 if (! local_plt_offsets)
1546 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1547 if (symtab_hdr->sh_info != 0)
1549 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1550 if (isymbuf == NULL)
1551 isymbuf = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
1552 symtab_hdr->sh_info, 0,
1554 if (isymbuf == NULL)
1558 for (idx = 0; idx < symtab_hdr->sh_info; ++idx)
1560 Elf_Internal_Sym *isym;
1564 if (local_plt_offsets[idx] == (bfd_vma) -1)
1567 isym = &isymbuf[idx];
1568 if (isym->st_shndx == SHN_UNDEF)
1570 else if (isym->st_shndx == SHN_ABS)
1571 tsec = bfd_abs_section_ptr;
1572 else if (isym->st_shndx == SHN_COMMON)
1573 tsec = bfd_com_section_ptr;
1575 tsec = bfd_section_from_elf_index (ibfd, isym->st_shndx);
1577 address = (tsec->output_section->vma
1578 + tsec->output_offset
1580 if (valid_16bit_address (address))
1582 local_plt_offsets[idx] = -1;
1589 && symtab_hdr->contents != (unsigned char *) isymbuf)
1591 if (! info->keep_memory)
1595 /* Cache the symbols for elf_link_input_bfd. */
1596 symtab_hdr->contents = (unsigned char *) isymbuf;
1601 /* If we changed anything, walk the symbols again to reallocate
1602 .plt entry addresses. */
1603 if (*again && splt->size > 0)
1607 elf_link_hash_traverse (elf_hash_table (info),
1608 rl78_relax_plt_realloc, &entry);
1610 for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1612 bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1613 unsigned int nlocals = elf_tdata (ibfd)->symtab_hdr.sh_info;
1616 if (! local_plt_offsets)
1619 for (idx = 0; idx < nlocals; ++idx)
1620 if (local_plt_offsets[idx] != (bfd_vma) -1)
1622 local_plt_offsets[idx] = entry;
1631 /* Delete some bytes from a section while relaxing. */
1634 elf32_rl78_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count,
1635 Elf_Internal_Rela *alignment_rel, int force_snip)
1637 Elf_Internal_Shdr * symtab_hdr;
1638 unsigned int sec_shndx;
1639 bfd_byte * contents;
1640 Elf_Internal_Rela * irel;
1641 Elf_Internal_Rela * irelend;
1642 Elf_Internal_Sym * isym;
1643 Elf_Internal_Sym * isymend;
1645 unsigned int symcount;
1646 struct elf_link_hash_entry ** sym_hashes;
1647 struct elf_link_hash_entry ** end_hashes;
1652 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1654 contents = elf_section_data (sec)->this_hdr.contents;
1656 /* The deletion must stop at the next alignment boundary, if
1657 ALIGNMENT_REL is non-NULL. */
1660 toaddr = alignment_rel->r_offset;
1662 irel = elf_section_data (sec)->relocs;
1665 _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL, TRUE);
1666 irel = elf_section_data (sec)->relocs;
1669 irelend = irel + sec->reloc_count;
1671 /* Actually delete the bytes. */
1672 memmove (contents + addr, contents + addr + count,
1673 (size_t) (toaddr - addr - count));
1675 /* If we don't have an alignment marker to worry about, we can just
1676 shrink the section. Otherwise, we have to fill in the newly
1677 created gap with NOP insns (0x03). */
1681 memset (contents + toaddr - count, 0x03, count);
1683 /* Adjust all the relocs. */
1684 for (; irel && irel < irelend; irel++)
1686 /* Get the new reloc address. */
1687 if (irel->r_offset > addr
1688 && (irel->r_offset < toaddr
1689 || (force_snip && irel->r_offset == toaddr)))
1690 irel->r_offset -= count;
1692 /* If we see an ALIGN marker at the end of the gap, we move it
1693 to the beginning of the gap, since marking these gaps is what
1695 if (irel->r_offset == toaddr
1696 && ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
1697 && irel->r_addend & RL78_RELAXA_ALIGN)
1698 irel->r_offset -= count;
1701 /* Adjust the local symbols defined in this section. */
1702 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1703 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1704 isymend = isym + symtab_hdr->sh_info;
1706 for (; isym < isymend; isym++)
1708 /* If the symbol is in the range of memory we just moved, we
1709 have to adjust its value. */
1710 if (isym->st_shndx == sec_shndx
1711 && isym->st_value > addr
1712 && isym->st_value < toaddr)
1713 isym->st_value -= count;
1715 /* If the symbol *spans* the bytes we just deleted (i.e. it's
1716 *end* is in the moved bytes but it's *start* isn't), then we
1717 must adjust its size. */
1718 if (isym->st_shndx == sec_shndx
1719 && isym->st_value < addr
1720 && isym->st_value + isym->st_size > addr
1721 && isym->st_value + isym->st_size < toaddr)
1722 isym->st_size -= count;
1725 /* Now adjust the global symbols defined in this section. */
1726 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1727 - symtab_hdr->sh_info);
1728 sym_hashes = elf_sym_hashes (abfd);
1729 end_hashes = sym_hashes + symcount;
1731 for (; sym_hashes < end_hashes; sym_hashes++)
1733 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1735 if ((sym_hash->root.type == bfd_link_hash_defined
1736 || sym_hash->root.type == bfd_link_hash_defweak)
1737 && sym_hash->root.u.def.section == sec)
1739 /* As above, adjust the value if needed. */
1740 if (sym_hash->root.u.def.value > addr
1741 && sym_hash->root.u.def.value < toaddr)
1742 sym_hash->root.u.def.value -= count;
1744 /* As above, adjust the size if needed. */
1745 if (sym_hash->root.u.def.value < addr
1746 && sym_hash->root.u.def.value + sym_hash->size > addr
1747 && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1748 sym_hash->size -= count;
1755 /* Used to sort relocs by address. If relocs have the same address,
1756 we maintain their relative order, except that R_RL78_RH_RELAX
1757 alignment relocs must be the first reloc for any given address. */
1760 reloc_bubblesort (Elf_Internal_Rela * r, int count)
1764 bfd_boolean swappit;
1766 /* This is almost a classic bubblesort. It's the slowest sort, but
1767 we're taking advantage of the fact that the relocations are
1768 mostly in order already (the assembler emits them that way) and
1769 we need relocs with the same address to remain in the same
1775 for (i = 0; i < count - 1; i ++)
1777 if (r[i].r_offset > r[i + 1].r_offset)
1779 else if (r[i].r_offset < r[i + 1].r_offset)
1781 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
1782 && (r[i + 1].r_addend & RL78_RELAXA_ALIGN))
1784 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
1785 && (r[i + 1].r_addend & RL78_RELAXA_ELIGN)
1786 && !(ELF32_R_TYPE (r[i].r_info) == R_RL78_RH_RELAX
1787 && (r[i].r_addend & RL78_RELAXA_ALIGN)))
1794 Elf_Internal_Rela tmp;
1799 /* If we do move a reloc back, re-scan to see if it
1800 needs to be moved even further back. This avoids
1801 most of the O(n^2) behavior for our cases. */
1811 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
1812 rl78_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1813 lrel, abfd, sec, link_info, scale)
1816 rl78_offset_for_reloc (bfd * abfd,
1817 Elf_Internal_Rela * rel,
1818 Elf_Internal_Shdr * symtab_hdr,
1819 Elf_External_Sym_Shndx * shndx_buf ATTRIBUTE_UNUSED,
1820 Elf_Internal_Sym * intsyms,
1821 Elf_Internal_Rela ** lrel,
1823 asection * input_section,
1824 struct bfd_link_info * info,
1831 /* REL is the first of 1..N relocations. We compute the symbol
1832 value for each relocation, then combine them if needed. LREL
1833 gets a pointer to the last relocation used. */
1836 unsigned long r_type;
1838 /* Get the value of the symbol referred to by the reloc. */
1839 if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1841 /* A local symbol. */
1842 Elf_Internal_Sym *isym;
1845 isym = intsyms + ELF32_R_SYM (rel->r_info);
1847 if (isym->st_shndx == SHN_UNDEF)
1848 ssec = bfd_und_section_ptr;
1849 else if (isym->st_shndx == SHN_ABS)
1850 ssec = bfd_abs_section_ptr;
1851 else if (isym->st_shndx == SHN_COMMON)
1852 ssec = bfd_com_section_ptr;
1854 ssec = bfd_section_from_elf_index (abfd,
1857 /* Initial symbol value. */
1858 symval = isym->st_value;
1860 /* GAS may have made this symbol relative to a section, in
1861 which case, we have to add the addend to find the
1863 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
1864 symval += rel->r_addend;
1868 if ((ssec->flags & SEC_MERGE)
1869 && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
1870 symval = _bfd_merged_section_offset (abfd, & ssec,
1871 elf_section_data (ssec)->sec_info,
1875 /* Now make the offset relative to where the linker is putting it. */
1878 ssec->output_section->vma + ssec->output_offset;
1880 symval += rel->r_addend;
1885 struct elf_link_hash_entry * h;
1887 /* An external symbol. */
1888 indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1889 h = elf_sym_hashes (abfd)[indx];
1890 BFD_ASSERT (h != NULL);
1892 if (h->root.type != bfd_link_hash_defined
1893 && h->root.type != bfd_link_hash_defweak)
1895 /* This appears to be a reference to an undefined
1896 symbol. Just ignore it--it will be caught by the
1897 regular reloc processing. */
1903 symval = (h->root.u.def.value
1904 + h->root.u.def.section->output_section->vma
1905 + h->root.u.def.section->output_offset);
1907 symval += rel->r_addend;
1910 r_type = ELF32_R_TYPE (rel->r_info);
1914 (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1917 case R_RL78_OPromtop:
1918 symval = get_romstart (info, input_bfd, input_section, rel->r_offset);
1919 (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1922 case R_RL78_OPramtop:
1923 symval = get_ramstart (info, input_bfd, input_section, rel->r_offset);
1924 (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1934 case R_RL78_OPsctsize:
1935 case R_RL78_OPscttop:
1941 (void) rl78_compute_complex_reloc (r_type, 0, input_section);
1944 case R_RL78_DIR16UL:
1946 case R_RL78_ABS16UL:
1949 goto reloc_computes_value;
1951 case R_RL78_DIR16UW:
1953 case R_RL78_ABS16UW:
1956 goto reloc_computes_value;
1959 reloc_computes_value:
1960 symval = rl78_compute_complex_reloc (r_type, symval, input_section);
1967 case R_RL78_DIR24S_PCREL:
1968 case R_RL78_DIR16S_PCREL:
1969 case R_RL78_DIR8S_PCREL:
1980 int prefix; /* or -1 for "no prefix" */
1981 int insn; /* or -1 for "end of list" */
1982 int insn_for_saddr; /* or -1 for "no alternative" */
1983 int insn_for_sfr; /* or -1 for "no alternative" */
1984 } relax_addr16[] = {
1985 { -1, 0x02, 0x06, -1 }, /* ADDW AX, !addr16 */
1986 { -1, 0x22, 0x26, -1 }, /* SUBW AX, !addr16 */
1987 { -1, 0x42, 0x46, -1 }, /* CMPW AX, !addr16 */
1988 { -1, 0x40, 0x4a, -1 }, /* CMP !addr16, #byte */
1990 { -1, 0x0f, 0x0b, -1 }, /* ADD A, !addr16 */
1991 { -1, 0x1f, 0x1b, -1 }, /* ADDC A, !addr16 */
1992 { -1, 0x2f, 0x2b, -1 }, /* SUB A, !addr16 */
1993 { -1, 0x3f, 0x3b, -1 }, /* SUBC A, !addr16 */
1994 { -1, 0x4f, 0x4b, -1 }, /* CMP A, !addr16 */
1995 { -1, 0x5f, 0x5b, -1 }, /* AND A, !addr16 */
1996 { -1, 0x6f, 0x6b, -1 }, /* OR A, !addr16 */
1997 { -1, 0x7f, 0x7b, -1 }, /* XOR A, !addr16 */
1999 { -1, 0x8f, 0x8d, 0x8e }, /* MOV A, !addr16 */
2000 { -1, 0x9f, 0x9d, 0x9e }, /* MOV !addr16, A */
2001 { -1, 0xaf, 0xad, 0xae }, /* MOVW AX, !addr16 */
2002 { -1, 0xbf, 0xbd, 0xbe }, /* MOVW !addr16, AX */
2003 { -1, 0xcf, 0xcd, 0xce }, /* MOVW !addr16, #word */
2005 { -1, 0xa0, 0xa4, -1 }, /* INC !addr16 */
2006 { -1, 0xa2, 0xa6, -1 }, /* INCW !addr16 */
2007 { -1, 0xb0, 0xb4, -1 }, /* DEC !addr16 */
2008 { -1, 0xb2, 0xb6, -1 }, /* DECW !addr16 */
2010 { -1, 0xd5, 0xd4, -1 }, /* CMP0 !addr16 */
2011 { -1, 0xe5, 0xe4, -1 }, /* ONEB !addr16 */
2012 { -1, 0xf5, 0xf4, -1 }, /* CLRB !addr16 */
2014 { -1, 0xd9, 0xd8, -1 }, /* MOV X, !addr16 */
2015 { -1, 0xe9, 0xe8, -1 }, /* MOV B, !addr16 */
2016 { -1, 0xf9, 0xf8, -1 }, /* MOV C, !addr16 */
2017 { -1, 0xdb, 0xda, -1 }, /* MOVW BC, !addr16 */
2018 { -1, 0xeb, 0xea, -1 }, /* MOVW DE, !addr16 */
2019 { -1, 0xfb, 0xfa, -1 }, /* MOVW HL, !addr16 */
2021 { 0x61, 0xaa, 0xa8, -1 }, /* XCH A, !addr16 */
2023 { 0x71, 0x00, 0x02, 0x0a }, /* SET1 !addr16.0 */
2024 { 0x71, 0x10, 0x12, 0x1a }, /* SET1 !addr16.0 */
2025 { 0x71, 0x20, 0x22, 0x2a }, /* SET1 !addr16.0 */
2026 { 0x71, 0x30, 0x32, 0x3a }, /* SET1 !addr16.0 */
2027 { 0x71, 0x40, 0x42, 0x4a }, /* SET1 !addr16.0 */
2028 { 0x71, 0x50, 0x52, 0x5a }, /* SET1 !addr16.0 */
2029 { 0x71, 0x60, 0x62, 0x6a }, /* SET1 !addr16.0 */
2030 { 0x71, 0x70, 0x72, 0x7a }, /* SET1 !addr16.0 */
2032 { 0x71, 0x08, 0x03, 0x0b }, /* CLR1 !addr16.0 */
2033 { 0x71, 0x18, 0x13, 0x1b }, /* CLR1 !addr16.0 */
2034 { 0x71, 0x28, 0x23, 0x2b }, /* CLR1 !addr16.0 */
2035 { 0x71, 0x38, 0x33, 0x3b }, /* CLR1 !addr16.0 */
2036 { 0x71, 0x48, 0x43, 0x4b }, /* CLR1 !addr16.0 */
2037 { 0x71, 0x58, 0x53, 0x5b }, /* CLR1 !addr16.0 */
2038 { 0x71, 0x68, 0x63, 0x6b }, /* CLR1 !addr16.0 */
2039 { 0x71, 0x78, 0x73, 0x7b }, /* CLR1 !addr16.0 */
2044 /* Relax one section. */
2047 rl78_elf_relax_section
2050 struct bfd_link_info * link_info,
2051 bfd_boolean * again)
2053 Elf_Internal_Shdr * symtab_hdr;
2054 Elf_Internal_Shdr * shndx_hdr;
2055 Elf_Internal_Rela * internal_relocs;
2056 Elf_Internal_Rela * free_relocs = NULL;
2057 Elf_Internal_Rela * irel;
2058 Elf_Internal_Rela * srel;
2059 Elf_Internal_Rela * irelend;
2060 Elf_Internal_Rela * next_alignment;
2061 bfd_byte * contents = NULL;
2062 bfd_byte * free_contents = NULL;
2063 Elf_Internal_Sym * intsyms = NULL;
2064 Elf_Internal_Sym * free_intsyms = NULL;
2065 Elf_External_Sym_Shndx * shndx_buf = NULL;
2067 bfd_vma symval ATTRIBUTE_UNUSED = 0;
2068 int pcrel ATTRIBUTE_UNUSED = 0;
2069 int code ATTRIBUTE_UNUSED = 0;
2070 int section_alignment_glue;
2073 if (abfd == elf_hash_table (link_info)->dynobj
2074 && strcmp (sec->name, ".plt") == 0)
2075 return rl78_elf_relax_plt_section (abfd, sec, link_info, again);
2077 /* Assume nothing changes. */
2080 /* We don't have to do anything for a relocatable link, if
2081 this section does not have relocs, or if this is not a
2083 if (bfd_link_relocatable (link_info)
2084 || (sec->flags & SEC_RELOC) == 0
2085 || sec->reloc_count == 0
2086 || (sec->flags & SEC_CODE) == 0)
2089 symtab_hdr = & elf_symtab_hdr (abfd);
2090 if (elf_symtab_shndx_list (abfd))
2091 shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
2095 /* Get the section contents. */
2096 if (elf_section_data (sec)->this_hdr.contents != NULL)
2097 contents = elf_section_data (sec)->this_hdr.contents;
2098 /* Go get them off disk. */
2101 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2103 elf_section_data (sec)->this_hdr.contents = contents;
2106 /* Read this BFD's symbols. */
2107 /* Get cached copy if it exists. */
2108 if (symtab_hdr->contents != NULL)
2109 intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
2112 intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
2113 symtab_hdr->contents = (bfd_byte *) intsyms;
2116 if (shndx_hdr && shndx_hdr->sh_size != 0)
2120 amt = symtab_hdr->sh_info;
2121 amt *= sizeof (Elf_External_Sym_Shndx);
2122 shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
2123 if (shndx_buf == NULL)
2125 if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
2126 || bfd_bread (shndx_buf, amt, abfd) != amt)
2128 shndx_hdr->contents = (bfd_byte *) shndx_buf;
2131 /* Get a copy of the native relocations. */
2132 internal_relocs = (_bfd_elf_link_read_relocs
2133 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2134 link_info->keep_memory));
2135 if (internal_relocs == NULL)
2137 if (! link_info->keep_memory)
2138 free_relocs = internal_relocs;
2140 /* The RL_ relocs must be just before the operand relocs they go
2141 with, so we must sort them to guarantee this. We use bubblesort
2142 instead of qsort so we can guarantee that relocs with the same
2143 address remain in the same relative order. */
2144 reloc_bubblesort (internal_relocs, sec->reloc_count);
2146 /* Walk through them looking for relaxing opportunities. */
2147 irelend = internal_relocs + sec->reloc_count;
2150 /* This will either be NULL or a pointer to the next alignment
2152 next_alignment = internal_relocs;
2154 /* We calculate worst case shrinkage caused by alignment directives.
2155 No fool-proof, but better than either ignoring the problem or
2156 doing heavy duty analysis of all the alignment markers in all
2158 section_alignment_glue = 0;
2159 for (irel = internal_relocs; irel < irelend; irel++)
2160 if (ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
2161 && irel->r_addend & RL78_RELAXA_ALIGN)
2163 int this_glue = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
2165 if (section_alignment_glue < this_glue)
2166 section_alignment_glue = this_glue;
2168 /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
2170 section_alignment_glue *= 2;
2172 for (irel = internal_relocs; irel < irelend; irel++)
2174 unsigned char *insn;
2177 /* The insns we care about are all marked with one of these. */
2178 if (ELF32_R_TYPE (irel->r_info) != R_RL78_RH_RELAX)
2181 if (irel->r_addend & RL78_RELAXA_ALIGN
2182 || next_alignment == internal_relocs)
2184 /* When we delete bytes, we need to maintain all the alignments
2185 indicated. In addition, we need to be careful about relaxing
2186 jumps across alignment boundaries - these displacements
2187 *grow* when we delete bytes. For now, don't shrink
2188 displacements across an alignment boundary, just in case.
2189 Note that this only affects relocations to the same
2191 next_alignment += 2;
2192 while (next_alignment < irelend
2193 && (ELF32_R_TYPE (next_alignment->r_info) != R_RL78_RH_RELAX
2194 || !(next_alignment->r_addend & RL78_RELAXA_ELIGN)))
2196 if (next_alignment >= irelend || next_alignment->r_offset == 0)
2197 next_alignment = NULL;
2200 /* When we hit alignment markers, see if we've shrunk enough
2201 before them to reduce the gap without violating the alignment
2203 if (irel->r_addend & RL78_RELAXA_ALIGN)
2205 /* At this point, the next relocation *should* be the ELIGN
2207 Elf_Internal_Rela *erel = irel + 1;
2208 unsigned int alignment, nbytes;
2210 if (ELF32_R_TYPE (erel->r_info) != R_RL78_RH_RELAX)
2212 if (!(erel->r_addend & RL78_RELAXA_ELIGN))
2215 alignment = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
2217 if (erel->r_offset - irel->r_offset < alignment)
2220 nbytes = erel->r_offset - irel->r_offset;
2221 nbytes /= alignment;
2222 nbytes *= alignment;
2224 elf32_rl78_relax_delete_bytes (abfd, sec, erel->r_offset - nbytes, nbytes,
2225 next_alignment, erel->r_offset == sec->size);
2231 if (irel->r_addend & RL78_RELAXA_ELIGN)
2234 insn = contents + irel->r_offset;
2236 nrelocs = irel->r_addend & RL78_RELAXA_RNUM;
2238 /* At this point, we have an insn that is a candidate for linker
2239 relaxation. There are NRELOCS relocs following that may be
2240 relaxed, although each reloc may be made of more than one
2241 reloc entry (such as gp-rel symbols). */
2243 /* Get the value of the symbol referred to by the reloc. Just
2244 in case this is the last reloc in the list, use the RL's
2245 addend to choose between this reloc (no addend) or the next
2246 (yes addend, which means at least one following reloc). */
2248 /* srel points to the "current" reloction for this insn -
2249 actually the last reloc for a given operand, which is the one
2250 we need to update. We check the relaxations in the same
2251 order that the relocations happen, so we'll just push it
2255 pc = sec->output_section->vma + sec->output_offset
2259 BFD_ASSERT (nrelocs > 0); \
2260 symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \
2261 pcrel = symval - pc + srel->r_addend; \
2264 #define SNIPNR(offset, nbytes) \
2265 elf32_rl78_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0);
2267 #define SNIP(offset, nbytes, newtype) \
2268 SNIPNR (offset, nbytes); \
2269 srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2271 /* The order of these bit tests must match the order that the
2272 relocs appear in. Since we sorted those by offset, we can
2275 /*----------------------------------------------------------------------*/
2276 /* EF ad BR $rel8 pcrel
2277 ED al ah BR !abs16 abs
2278 EE al ah BR $!rel16 pcrel
2279 EC al ah as BR !!abs20 abs
2281 FD al ah CALL !abs16 abs
2282 FE al ah CALL $!rel16 pcrel
2283 FC al ah as CALL !!abs20 abs
2291 61 C8 EF ad SKC ; BR $rel8
2292 61 D8 EF ad SKNC ; BR $rel8
2293 61 E8 EF ad SKZ ; BR $rel8
2294 61 F8 EF ad SKNZ ; BR $rel8
2295 61 E3 EF ad SKH ; BR $rel8
2296 61 F3 EF ad SKNH ; BR $rel8
2299 if ((irel->r_addend & RL78_RELAXA_MASK) == RL78_RELAXA_BRA)
2301 /* SKIP opcodes that skip non-branches will have a relax tag
2302 but no corresponding symbol to relax against; we just
2304 if (irel->r_addend & RL78_RELAXA_RNUM)
2313 case 0xde: /* BNC */
2314 case 0xdf: /* BNZ */
2315 if (insn[1] == 0x03 && insn[2] == 0xee /* BR */
2316 && (srel->r_offset - irel->r_offset) > 1) /* a B<c> without its own reloc */
2318 /* This is a "long" conditional as generated by gas:
2323 insn[0] ^= 0x02; /* invert conditional */
2325 SNIP (1, 2, R_RL78_DIR8S_PCREL);
2332 case 0xec: /* BR !!abs20 */
2339 SNIP (2, 2, R_RL78_DIR8S_PCREL);
2342 else if (symval < 65536)
2345 insn[1] = symval & 0xff;
2346 insn[2] = symval >> 8;
2347 SNIP (2, 1, R_RL78_DIR16U);
2350 else if (pcrel < 32767
2354 insn[1] = pcrel & 0xff;
2355 insn[2] = pcrel >> 8;
2356 SNIP (2, 1, R_RL78_DIR16S_PCREL);
2361 case 0xee: /* BR $!pcrel16 */
2362 case 0xed: /* BR $!abs16 */
2368 SNIP (2, 1, R_RL78_DIR8S_PCREL);
2373 case 0xfc: /* CALL !!abs20 */
2377 insn[1] = symval & 0xff;
2378 insn[2] = symval >> 8;
2379 SNIP (2, 1, R_RL78_DIR16U);
2382 else if (pcrel < 32767
2386 insn[1] = pcrel & 0xff;
2387 insn[2] = pcrel >> 8;
2388 SNIP (2, 1, R_RL78_DIR16S_PCREL);
2393 case 0x61: /* PREFIX */
2394 /* For SKIP/BR, we change the BR opcode and delete the
2395 SKIP. That way, we don't have to find and change the
2396 relocation for the BR. */
2397 /* Note that, for the case where we're skipping some
2398 other insn, we have no "other" reloc but that's safe
2402 case 0xd3: /* BNH */
2404 if (insn[2] == 0x03 && insn[3] == 0xee
2405 && (srel->r_offset - irel->r_offset) > 2) /* a B<c> without its own reloc */
2407 /* Another long branch by gas:
2408 61 D3 03 EE ad.dr */
2412 insn[1] ^= 0x10; /* invert conditional */
2414 SNIP (2, 2, R_RL78_DIR8S_PCREL);
2421 case 0xc8: /* SKC */
2422 if (insn[2] == 0xef)
2424 insn[2] = 0xde; /* BNC */
2429 case 0xd8: /* SKNC */
2430 if (insn[2] == 0xef)
2432 insn[2] = 0xdc; /* BC */
2437 case 0xe8: /* SKZ */
2438 if (insn[2] == 0xef)
2440 insn[2] = 0xdf; /* BNZ */
2445 case 0xf8: /* SKNZ */
2446 if (insn[2] == 0xef)
2448 insn[2] = 0xdd; /* BZ */
2453 case 0xe3: /* SKH */
2454 if (insn[2] == 0xef)
2456 insn[2] = 0xd3; /* BNH */
2457 SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2461 case 0xf3: /* SKNH */
2462 if (insn[2] == 0xef)
2464 insn[2] = 0xc3; /* BH */
2465 SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2473 if ((irel->r_addend & RL78_RELAXA_MASK) == RL78_RELAXA_ADDR16
2476 /*----------------------------------------------------------------------*/
2477 /* Some insns have both a 16-bit address operand and an 8-bit
2478 variant if the address is within a special range:
2480 Address 16-bit operand SADDR range SFR range
2481 FFF00-FFFFF 0xff00-0xffff 0x00-0xff
2482 FFE20-FFF1F 0xfe20-0xff1f 0x00-0xff
2484 The RELAX_ADDR16[] array has the insn encodings for the
2485 16-bit operand version, as well as the SFR and SADDR
2486 variants. We only need to replace the encodings and
2489 Note: we intentionally do not attempt to decode and skip
2490 any ES: prefix, as adding ES: means the addr16 (likely)
2491 no longer points to saddr/sfr space.
2501 if (0xffe20 <= symval && symval <= 0xfffff)
2504 is_saddr = (0xffe20 <= symval && symval <= 0xfff1f);
2505 is_sfr = (0xfff00 <= symval && symval <= 0xfffff);
2507 for (idx = 0; relax_addr16[idx].insn != -1; idx ++)
2509 if (relax_addr16[idx].prefix != -1
2510 && insn[0] == relax_addr16[idx].prefix
2511 && insn[1] == relax_addr16[idx].insn)
2515 else if (relax_addr16[idx].prefix == -1
2516 && insn[0] == relax_addr16[idx].insn)
2523 /* We have a matched insn, and poff is 0 or 1 depending
2524 on the base pattern size. */
2526 if (is_sfr && relax_addr16[idx].insn_for_sfr != -1)
2528 insn[poff] = relax_addr16[idx].insn_for_sfr;
2529 SNIP (poff+2, 1, R_RL78_RH_SFR);
2532 else if (is_saddr && relax_addr16[idx].insn_for_saddr != -1)
2534 insn[poff] = relax_addr16[idx].insn_for_saddr;
2535 SNIP (poff+2, 1, R_RL78_RH_SADDR);
2540 /*----------------------------------------------------------------------*/
2546 if (free_relocs != NULL)
2549 if (free_contents != NULL)
2550 free (free_contents);
2552 if (shndx_buf != NULL)
2554 shndx_hdr->contents = NULL;
2558 if (free_intsyms != NULL)
2559 free (free_intsyms);
2566 #define ELF_ARCH bfd_arch_rl78
2567 #define ELF_MACHINE_CODE EM_RL78
2568 #define ELF_MAXPAGESIZE 0x1000
2570 #define TARGET_LITTLE_SYM rl78_elf32_vec
2571 #define TARGET_LITTLE_NAME "elf32-rl78"
2573 #define elf_info_to_howto_rel NULL
2574 #define elf_info_to_howto rl78_info_to_howto_rela
2575 #define elf_backend_object_p rl78_elf_object_p
2576 #define elf_backend_relocate_section rl78_elf_relocate_section
2577 #define elf_symbol_leading_char ('_')
2578 #define elf_backend_can_gc_sections 1
2580 #define bfd_elf32_bfd_reloc_type_lookup rl78_reloc_type_lookup
2581 #define bfd_elf32_bfd_reloc_name_lookup rl78_reloc_name_lookup
2582 #define bfd_elf32_bfd_set_private_flags rl78_elf_set_private_flags
2583 #define bfd_elf32_bfd_merge_private_bfd_data rl78_elf_merge_private_bfd_data
2584 #define bfd_elf32_bfd_print_private_bfd_data rl78_elf_print_private_bfd_data
2586 #define bfd_elf32_bfd_relax_section rl78_elf_relax_section
2587 #define elf_backend_check_relocs rl78_elf_check_relocs
2588 #define elf_backend_always_size_sections \
2589 rl78_elf_always_size_sections
2590 #define elf_backend_finish_dynamic_sections \
2591 rl78_elf_finish_dynamic_sections
2593 #include "elf32-target.h"