1 /* Renesas RL78 specific support for 32-bit ELF.
2 Copyright (C) 2011-2015 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),
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_RELAX, R_RL78_RH_RELAX }
248 static reloc_howto_type *
249 rl78_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
250 bfd_reloc_code_real_type code)
254 if (code == BFD_RELOC_RL78_32_OP)
255 return rl78_elf_howto_table + R_RL78_DIR32;
257 for (i = ARRAY_SIZE (rl78_reloc_map); i--;)
258 if (rl78_reloc_map [i].bfd_reloc_val == code)
259 return rl78_elf_howto_table + rl78_reloc_map[i].rl78_reloc_val;
264 static reloc_howto_type *
265 rl78_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED, const char * r_name)
269 for (i = 0; i < ARRAY_SIZE (rl78_elf_howto_table); i++)
270 if (rl78_elf_howto_table[i].name != NULL
271 && strcasecmp (rl78_elf_howto_table[i].name, r_name) == 0)
272 return rl78_elf_howto_table + i;
277 /* Set the howto pointer for an RL78 ELF reloc. */
280 rl78_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
282 Elf_Internal_Rela * dst)
286 r_type = ELF32_R_TYPE (dst->r_info);
287 if (r_type >= (unsigned int) R_RL78_max)
289 _bfd_error_handler (_("%B: invalid RL78 reloc number: %d"), abfd, r_type);
292 cache_ptr->howto = rl78_elf_howto_table + r_type;
296 get_symbol_value (const char * name,
297 bfd_reloc_status_type * status,
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 bfd_reloc_status_type res;
316 res = info->callbacks->undefined_symbol
317 (info, name, input_bfd, input_section, offset, TRUE);
323 return (h->u.def.value
324 + h->u.def.section->output_section->vma
325 + h->u.def.section->output_offset);
329 get_romstart (bfd_reloc_status_type * status,
330 struct bfd_link_info * info,
335 static bfd_boolean cached = FALSE;
336 static bfd_vma cached_value = 0;
337 static bfd_reloc_status_type cached_status;
341 cached_value = get_symbol_value ("_start", & cached_status, info, abfd, sec, offset);
345 * status = cached_status;
350 get_ramstart (bfd_reloc_status_type * status,
351 struct bfd_link_info * info,
356 static bfd_boolean cached = FALSE;
357 static bfd_vma cached_value = 0;
358 static bfd_reloc_status_type cached_status;
362 cached_value = get_symbol_value ("__datastart", & cached_status, info, abfd, sec, offset);
366 * status = cached_status;
370 #define NUM_STACK_ENTRIES 16
371 static int32_t rl78_stack [ NUM_STACK_ENTRIES ];
372 static unsigned int rl78_stack_top;
374 #define RL78_STACK_PUSH(val) \
377 if (rl78_stack_top < NUM_STACK_ENTRIES) \
378 rl78_stack [rl78_stack_top ++] = (val); \
380 _bfd_error_handler (_("Internal Error: RL78 reloc stack overflow")); \
384 #define RL78_STACK_POP(dest) \
387 if (rl78_stack_top > 0) \
388 (dest) = rl78_stack [-- rl78_stack_top];\
391 _bfd_error_handler (_("Internal Error: RL78 reloc stack underflow")); \
397 /* Special handling for RL78 complex relocs. Returns the
398 value of the reloc, or 0 for relocs which do not generate
399 a result. SYMVAL is the value of the symbol for relocs
400 which use a symbolic argument. */
403 rl78_compute_complex_reloc (unsigned long r_type,
405 asection * input_section)
415 case R_RL78_ABS24S_PCREL:
416 case R_RL78_ABS16S_PCREL:
417 case R_RL78_ABS8S_PCREL:
418 RL78_STACK_POP (relocation);
419 relocation -= input_section->output_section->vma + input_section->output_offset;
423 case R_RL78_ABS32_REV:
425 case R_RL78_ABS16_REV:
431 RL78_STACK_POP (relocation);
436 RL78_STACK_POP (relocation);
437 return relocation >> 2;
441 RL78_STACK_POP (relocation);
442 return relocation >> 1;
444 /* The rest of the relocs compute values and then push them onto the stack. */
445 case R_RL78_OPramtop:
446 case R_RL78_OPromtop:
448 RL78_STACK_PUSH (symval);
452 RL78_STACK_POP (tmp1);
454 RL78_STACK_PUSH (tmp1);
458 RL78_STACK_POP (tmp2);
459 RL78_STACK_POP (tmp1);
461 RL78_STACK_PUSH (tmp1);
465 /* For the expression "A - B", the assembler pushes A,
466 then B, then OPSUB. So the first op we pop is B, not A. */
467 RL78_STACK_POP (tmp2); /* B */
468 RL78_STACK_POP (tmp1); /* A */
469 tmp1 -= tmp2; /* A - B */
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);
495 RL78_STACK_POP (tmp2);
496 RL78_STACK_POP (tmp1);
498 RL78_STACK_PUSH (tmp1);
501 case R_RL78_OPsctsize:
502 RL78_STACK_PUSH (input_section->size);
505 case R_RL78_OPscttop:
506 RL78_STACK_PUSH (input_section->output_section->vma);
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 (tmp2);
525 RL78_STACK_POP (tmp1);
527 RL78_STACK_PUSH (tmp1);
531 RL78_STACK_POP (tmp1);
533 RL78_STACK_PUSH (tmp1);
537 RL78_STACK_POP (tmp2);
538 RL78_STACK_POP (tmp1);
540 RL78_STACK_PUSH (tmp1);
545 #undef RL78_STACK_PUSH
546 #undef RL78_STACK_POP
548 #define OP(i) (contents[reloc->address + (i)])
550 static bfd_reloc_status_type
551 rl78_special_reloc (bfd * input_bfd,
555 asection * input_section,
556 bfd * output_bfd ATTRIBUTE_UNUSED,
557 char ** error_message ATTRIBUTE_UNUSED)
559 bfd_reloc_status_type r = bfd_reloc_ok;
560 bfd_vma relocation = 0;
561 unsigned long r_type = reloc->howto->type;
562 bfd_byte * contents = data;
564 /* If necessary, compute the symbolic value of the relocation. */
568 relocation = (symbol->value
569 + symbol->section->output_section->vma
570 + symbol->section->output_offset
574 case R_RL78_OPromtop:
575 relocation = get_romstart (&r, NULL, input_bfd, input_section,
579 case R_RL78_OPramtop:
580 relocation = get_ramstart (&r, NULL, input_bfd, input_section,
585 /* Get the value of the relocation. */
586 relocation = rl78_compute_complex_reloc (r_type, relocation, input_section);
588 /* If the relocation alters the contents of the section then apply it now.
589 Note - since this function is called from
590 bfd_generic_get_relocated_section_contents via bfd_perform_relocation,
591 and not from the linker, we do not perform any range checking. The
592 clients who are calling us are only interested in some relocated section
593 contents, and not any linkage problems that might occur later. */
598 OP (1) = relocation >> 8;
599 OP (2) = relocation >> 16;
600 OP (3) = relocation >> 24;
603 case R_RL78_ABS32_REV:
605 OP (2) = relocation >> 8;
606 OP (1) = relocation >> 16;
607 OP (0) = relocation >> 24;
610 case R_RL78_ABS24S_PCREL:
613 OP (1) = relocation >> 8;
614 OP (2) = relocation >> 16;
617 case R_RL78_ABS16_REV:
619 OP (0) = relocation >> 8;
622 case R_RL78_ABS16S_PCREL:
629 OP (1) = relocation >> 8;
632 case R_RL78_ABS8S_PCREL:
649 #define OP(i) (contents[rel->r_offset + (i)])
651 /* Relocate an RL78 ELF section.
652 There is some attempt to make this function usable for many architectures,
653 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
654 if only to serve as a learning tool.
656 The RELOCATE_SECTION function is called by the new ELF backend linker
657 to handle the relocations for a section.
659 The relocs are always passed as Rela structures; if the section
660 actually uses Rel structures, the r_addend field will always be
663 This function is responsible for adjusting the section contents as
664 necessary, and (if using Rela relocs and generating a relocatable
665 output file) adjusting the reloc addend as necessary.
667 This function does not have to worry about setting the reloc
668 address or the reloc symbol index.
670 LOCAL_SYMS is a pointer to the swapped in local symbols.
672 LOCAL_SECTIONS is an array giving the section in the input file
673 corresponding to the st_shndx field of each local symbol.
675 The global hash table entry for the global symbols can be found
676 via elf_sym_hashes (input_bfd).
678 When generating relocatable output, this function must handle
679 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
680 going to be the section symbol corresponding to the output
681 section, which means that the addend must be adjusted
685 rl78_elf_relocate_section
687 struct bfd_link_info * info,
689 asection * input_section,
691 Elf_Internal_Rela * relocs,
692 Elf_Internal_Sym * local_syms,
693 asection ** local_sections)
695 Elf_Internal_Shdr * symtab_hdr;
696 struct elf_link_hash_entry ** sym_hashes;
697 Elf_Internal_Rela * rel;
698 Elf_Internal_Rela * relend;
702 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
703 sym_hashes = elf_sym_hashes (input_bfd);
704 relend = relocs + input_section->reloc_count;
706 dynobj = elf_hash_table (info)->dynobj;
709 splt = bfd_get_linker_section (dynobj, ".plt");
711 for (rel = relocs; rel < relend; rel ++)
713 reloc_howto_type * howto;
714 unsigned long r_symndx;
715 Elf_Internal_Sym * sym;
717 struct elf_link_hash_entry * h;
719 bfd_reloc_status_type r;
720 const char * name = NULL;
721 bfd_boolean unresolved_reloc = TRUE;
724 r_type = ELF32_R_TYPE (rel->r_info);
725 r_symndx = ELF32_R_SYM (rel->r_info);
727 howto = rl78_elf_howto_table + ELF32_R_TYPE (rel->r_info);
733 if (r_symndx < symtab_hdr->sh_info)
735 sym = local_syms + r_symndx;
736 sec = local_sections [r_symndx];
737 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, & sec, rel);
739 name = bfd_elf_string_from_elf_section
740 (input_bfd, symtab_hdr->sh_link, sym->st_name);
741 name = (sym->st_name == 0) ? bfd_section_name (input_bfd, sec) : name;
745 bfd_boolean warned ATTRIBUTE_UNUSED;
746 bfd_boolean ignored ATTRIBUTE_UNUSED;
748 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
749 r_symndx, symtab_hdr, sym_hashes, h,
750 sec, relocation, unresolved_reloc,
753 name = h->root.root.string;
756 if (sec != NULL && discarded_section (sec))
757 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
758 rel, 1, relend, howto, 0, contents);
760 if (info->relocatable)
762 /* This is a relocatable link. We don't have to change
763 anything, unless the reloc is against a section symbol,
764 in which case we have to adjust according to where the
765 section symbol winds up in the output section. */
766 if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
767 rel->r_addend += sec->output_offset;
771 switch (ELF32_R_TYPE (rel->r_info))
778 plt_offset = &h->plt.offset;
780 plt_offset = elf_local_got_offsets (input_bfd) + r_symndx;
782 if (! valid_16bit_address (relocation))
784 /* If this is the first time we've processed this symbol,
785 fill in the plt entry with the correct symbol address. */
786 if ((*plt_offset & 1) == 0)
790 x = 0x000000ec; /* br !!abs24 */
791 x |= (relocation << 8) & 0xffffff00;
792 bfd_put_32 (input_bfd, x, splt->contents + *plt_offset);
796 relocation = (splt->output_section->vma
797 + splt->output_offset
798 + (*plt_offset & -2));
801 char *newname = bfd_malloc (strlen(name)+5);
802 strcpy (newname, name);
803 strcat(newname, ".plt");
804 _bfd_generic_link_add_one_symbol (info,
807 BSF_FUNCTION | BSF_WEAK,
820 if (h != NULL && h->root.type == bfd_link_hash_undefweak)
821 /* If the symbol is undefined and weak
822 then the relocation resolves to zero. */
826 if (howto->pc_relative)
828 relocation -= (input_section->output_section->vma
829 + input_section->output_offset
831 relocation -= bfd_get_reloc_size (howto);
834 relocation += rel->r_addend;
839 #define RANGE(a,b) if (a > (long) relocation || (long) relocation > b) r = bfd_reloc_overflow
841 /* Opcode relocs are always big endian. Data relocs are bi-endian. */
847 case R_RL78_RH_RELAX:
850 case R_RL78_DIR8S_PCREL:
865 case R_RL78_DIR16S_PCREL:
866 RANGE (-32768, 32767);
868 OP (1) = relocation >> 8;
872 if ((relocation & 0xf0000) == 0xf0000)
873 relocation &= 0xffff;
874 RANGE (-32768, 65535);
876 OP (1) = relocation >> 8;
882 OP (1) = relocation >> 8;
886 RANGE (-32768, 65536);
888 OP (1) = relocation >> 8;
891 case R_RL78_DIR16_REV:
892 RANGE (-32768, 65536);
894 OP (0) = relocation >> 8;
897 case R_RL78_DIR3U_PCREL:
900 OP (0) |= relocation & 0x07;
903 case R_RL78_DIR24S_PCREL:
904 RANGE (-0x800000, 0x7fffff);
906 OP (1) = relocation >> 8;
907 OP (2) = relocation >> 16;
911 RANGE (-0x800000, 0x7fffff);
913 OP (1) = relocation >> 8;
914 OP (2) = relocation >> 16;
919 OP (1) = relocation >> 8;
920 OP (2) = relocation >> 16;
921 OP (3) = relocation >> 24;
924 case R_RL78_DIR32_REV:
926 OP (2) = relocation >> 8;
927 OP (1) = relocation >> 16;
928 OP (0) = relocation >> 24;
932 RANGE (0xfff00, 0xfffff);
933 OP (0) = relocation & 0xff;
936 case R_RL78_RH_SADDR:
937 RANGE (0xffe20, 0xfff1f);
938 OP (0) = relocation & 0xff;
941 /* Complex reloc handling: */
943 case R_RL78_ABS32_REV:
944 case R_RL78_ABS24S_PCREL:
947 case R_RL78_ABS16_REV:
948 case R_RL78_ABS16S_PCREL:
957 case R_RL78_ABS8S_PCREL:
966 case R_RL78_OPsctsize:
967 case R_RL78_OPscttop:
973 relocation = rl78_compute_complex_reloc (r_type, 0, input_section);
979 OP (1) = relocation >> 8;
980 OP (2) = relocation >> 16;
981 OP (3) = relocation >> 24;
984 case R_RL78_ABS32_REV:
986 OP (2) = relocation >> 8;
987 OP (1) = relocation >> 16;
988 OP (0) = relocation >> 24;
991 case R_RL78_ABS24S_PCREL:
993 RANGE (-0x800000, 0x7fffff);
995 OP (1) = relocation >> 8;
996 OP (2) = relocation >> 16;
1000 RANGE (-32768, 65535);
1001 OP (0) = relocation;
1002 OP (1) = relocation >> 8;
1005 case R_RL78_ABS16_REV:
1006 RANGE (-32768, 65535);
1007 OP (1) = relocation;
1008 OP (0) = relocation >> 8;
1011 case R_RL78_ABS16S_PCREL:
1013 RANGE (-32768, 32767);
1014 OP (0) = relocation;
1015 OP (1) = relocation >> 8;
1019 case R_RL78_ABS16UL:
1020 case R_RL78_ABS16UW:
1022 OP (0) = relocation;
1023 OP (1) = relocation >> 8;
1028 OP (0) = relocation;
1035 OP (0) = relocation;
1038 case R_RL78_ABS8S_PCREL:
1041 OP (0) = relocation;
1050 if (r_symndx < symtab_hdr->sh_info)
1051 relocation = sec->output_section->vma + sec->output_offset
1052 + sym->st_value + rel->r_addend;
1054 && (h->root.type == bfd_link_hash_defined
1055 || h->root.type == bfd_link_hash_defweak))
1056 relocation = h->root.u.def.value
1057 + sec->output_section->vma
1058 + sec->output_offset
1063 if (h->root.type != bfd_link_hash_undefweak)
1064 _bfd_error_handler (_("Warning: RL78_SYM reloc with an unknown symbol"));
1066 (void) rl78_compute_complex_reloc (r_type, relocation, input_section);
1069 case R_RL78_OPromtop:
1070 relocation = get_romstart (&r, info, input_bfd, input_section, rel->r_offset);
1071 (void) rl78_compute_complex_reloc (r_type, relocation, input_section);
1074 case R_RL78_OPramtop:
1075 relocation = get_ramstart (&r, info, input_bfd, input_section, rel->r_offset);
1076 (void) rl78_compute_complex_reloc (r_type, relocation, input_section);
1080 r = bfd_reloc_notsupported;
1084 if (r != bfd_reloc_ok)
1086 const char * msg = NULL;
1090 case bfd_reloc_overflow:
1091 /* Catch the case of a missing function declaration
1092 and emit a more helpful error message. */
1093 if (r_type == R_RL78_DIR24S_PCREL)
1094 msg = _("%B(%A): error: call to undefined function '%s'");
1096 r = info->callbacks->reloc_overflow
1097 (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
1098 input_bfd, input_section, rel->r_offset);
1101 case bfd_reloc_undefined:
1102 r = info->callbacks->undefined_symbol
1103 (info, name, input_bfd, input_section, rel->r_offset,
1107 case bfd_reloc_other:
1108 msg = _("%B(%A): warning: unaligned access to symbol '%s' in the small data area");
1111 case bfd_reloc_outofrange:
1112 msg = _("%B(%A): internal error: out of range error");
1115 case bfd_reloc_notsupported:
1116 msg = _("%B(%A): internal error: unsupported relocation error");
1119 case bfd_reloc_dangerous:
1120 msg = _("%B(%A): internal error: dangerous relocation");
1124 msg = _("%B(%A): internal error: unknown error");
1129 _bfd_error_handler (msg, input_bfd, input_section, name);
1139 /* Function to set the ELF flag bits. */
1142 rl78_elf_set_private_flags (bfd * abfd, flagword flags)
1144 elf_elfheader (abfd)->e_flags = flags;
1145 elf_flags_init (abfd) = TRUE;
1149 static bfd_boolean no_warn_mismatch = FALSE;
1151 void bfd_elf32_rl78_set_target_flags (bfd_boolean);
1154 bfd_elf32_rl78_set_target_flags (bfd_boolean user_no_warn_mismatch)
1156 no_warn_mismatch = user_no_warn_mismatch;
1160 rl78_cpu_name (flagword flags)
1162 switch (flags & E_FLAG_RL78_CPU_MASK)
1165 case E_FLAG_RL78_G10: return "G10";
1166 case E_FLAG_RL78_G13: return "G13";
1167 case E_FLAG_RL78_G14: return "G14";
1171 /* Merge backend specific data from an object file to the output
1172 object file when linking. */
1175 rl78_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
1179 bfd_boolean error = FALSE;
1181 new_flags = elf_elfheader (ibfd)->e_flags;
1182 old_flags = elf_elfheader (obfd)->e_flags;
1184 if (!elf_flags_init (obfd))
1186 /* First call, no flags set. */
1187 elf_flags_init (obfd) = TRUE;
1188 elf_elfheader (obfd)->e_flags = new_flags;
1190 else if (old_flags != new_flags)
1192 flagword changed_flags = old_flags ^ new_flags;
1194 if (changed_flags & E_FLAG_RL78_CPU_MASK)
1196 flagword out_cpu = old_flags & E_FLAG_RL78_CPU_MASK;
1197 flagword in_cpu = new_flags & E_FLAG_RL78_CPU_MASK;
1199 if (in_cpu == E_FLAG_RL78_ANY_CPU || in_cpu == out_cpu)
1200 /* It does not matter what new_cpu may have. */;
1201 else if (out_cpu == E_FLAG_RL78_ANY_CPU)
1203 if (in_cpu == E_FLAG_RL78_G10)
1205 /* G10 files can only be linked with other G10 files.
1206 If the output is set to "any" this means that it is
1207 a G14 file that does not use hardware multiply/divide,
1208 but that is still incompatible with the G10 ABI. */
1211 (*_bfd_error_handler)
1212 (_("RL78 ABI conflict: G10 file %s cannot be linked with %s file %s"),
1213 bfd_get_filename (ibfd),
1214 rl78_cpu_name (out_cpu), bfd_get_filename (obfd));
1218 old_flags &= ~ E_FLAG_RL78_CPU_MASK;
1219 old_flags |= in_cpu;
1220 elf_elfheader (obfd)->e_flags = old_flags;
1227 (*_bfd_error_handler)
1228 (_("RL78 ABI conflict: cannot link %s file %s with %s file %s"),
1229 rl78_cpu_name (in_cpu), bfd_get_filename (ibfd),
1230 rl78_cpu_name (out_cpu), bfd_get_filename (obfd));
1234 if (changed_flags & E_FLAG_RL78_64BIT_DOUBLES)
1236 (*_bfd_error_handler)
1237 (_("RL78 merge conflict: cannot link 32-bit and 64-bit objects together"));
1239 if (old_flags & E_FLAG_RL78_64BIT_DOUBLES)
1240 (*_bfd_error_handler) (_("- %s is 64-bit, %s is not"),
1241 bfd_get_filename (obfd), bfd_get_filename (ibfd));
1243 (*_bfd_error_handler) (_("- %s is 64-bit, %s is not"),
1244 bfd_get_filename (ibfd), bfd_get_filename (obfd));
1253 rl78_elf_print_private_bfd_data (bfd * abfd, void * ptr)
1255 FILE * file = (FILE *) ptr;
1258 BFD_ASSERT (abfd != NULL && ptr != NULL);
1260 /* Print normal ELF private data. */
1261 _bfd_elf_print_private_bfd_data (abfd, ptr);
1263 flags = elf_elfheader (abfd)->e_flags;
1264 fprintf (file, _("private flags = 0x%lx:"), (long) flags);
1266 if (flags & E_FLAG_RL78_CPU_MASK)
1267 fprintf (file, " [%s]", rl78_cpu_name (flags));
1269 if (flags & E_FLAG_RL78_64BIT_DOUBLES)
1270 fprintf (file, _(" [64-bit doubles]"));
1276 /* Return the MACH for an e_flags value. */
1279 elf32_rl78_machine (bfd * abfd ATTRIBUTE_UNUSED)
1281 return bfd_mach_rl78;
1285 rl78_elf_object_p (bfd * abfd)
1287 bfd_default_set_arch_mach (abfd, bfd_arch_rl78,
1288 elf32_rl78_machine (abfd));
1292 /* support PLT for 16-bit references to 24-bit functions. */
1294 /* We support 16-bit pointers to code above 64k by generating a thunk
1295 below 64k containing a JMP instruction to the final address. */
1298 rl78_elf_check_relocs
1300 struct bfd_link_info * info,
1302 const Elf_Internal_Rela * relocs)
1304 Elf_Internal_Shdr * symtab_hdr;
1305 struct elf_link_hash_entry ** sym_hashes;
1306 const Elf_Internal_Rela * rel;
1307 const Elf_Internal_Rela * rel_end;
1308 bfd_vma *local_plt_offsets;
1312 if (info->relocatable)
1315 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1316 sym_hashes = elf_sym_hashes (abfd);
1317 local_plt_offsets = elf_local_got_offsets (abfd);
1319 dynobj = elf_hash_table(info)->dynobj;
1321 rel_end = relocs + sec->reloc_count;
1322 for (rel = relocs; rel < rel_end; rel++)
1324 struct elf_link_hash_entry *h;
1325 unsigned long r_symndx;
1328 r_symndx = ELF32_R_SYM (rel->r_info);
1329 if (r_symndx < symtab_hdr->sh_info)
1333 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1334 while (h->root.type == bfd_link_hash_indirect
1335 || h->root.type == bfd_link_hash_warning)
1336 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1338 /* PR15323, ref flags aren't set for references in the same
1340 h->root.non_ir_ref = 1;
1343 switch (ELF32_R_TYPE (rel->r_info))
1345 /* This relocation describes a 16-bit pointer to a function.
1346 We may need to allocate a thunk in low memory; reserve memory
1350 elf_hash_table (info)->dynobj = dynobj = abfd;
1353 splt = bfd_get_linker_section (dynobj, ".plt");
1356 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1357 | SEC_IN_MEMORY | SEC_LINKER_CREATED
1358 | SEC_READONLY | SEC_CODE);
1359 splt = bfd_make_section_anyway_with_flags (dynobj, ".plt",
1362 || ! bfd_set_section_alignment (dynobj, splt, 1))
1368 offset = &h->plt.offset;
1371 if (local_plt_offsets == NULL)
1376 size = symtab_hdr->sh_info * sizeof (bfd_vma);
1377 local_plt_offsets = (bfd_vma *) bfd_alloc (abfd, size);
1378 if (local_plt_offsets == NULL)
1380 elf_local_got_offsets (abfd) = local_plt_offsets;
1382 for (i = 0; i < symtab_hdr->sh_info; i++)
1383 local_plt_offsets[i] = (bfd_vma) -1;
1385 offset = &local_plt_offsets[r_symndx];
1388 if (*offset == (bfd_vma) -1)
1390 *offset = splt->size;
1400 /* This must exist if dynobj is ever set. */
1403 rl78_elf_finish_dynamic_sections (bfd *abfd ATTRIBUTE_UNUSED,
1404 struct bfd_link_info *info)
1409 if (!elf_hash_table (info)->dynamic_sections_created)
1412 /* As an extra sanity check, verify that all plt entries have been
1413 filled in. However, relaxing might have changed the relocs so
1414 that some plt entries don't get filled in, so we have to skip
1415 this check if we're relaxing. Unfortunately, check_relocs is
1416 called before relaxation. */
1418 if (info->relax_trip > 0)
1421 if ((dynobj = elf_hash_table (info)->dynobj) != NULL
1422 && (splt = bfd_get_linker_section (dynobj, ".plt")) != NULL)
1424 bfd_byte *contents = splt->contents;
1425 unsigned int i, size = splt->size;
1427 for (i = 0; i < size; i += 4)
1429 unsigned int x = bfd_get_32 (dynobj, contents + i);
1430 BFD_ASSERT (x != 0);
1438 rl78_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1439 struct bfd_link_info *info)
1444 if (info->relocatable)
1447 dynobj = elf_hash_table (info)->dynobj;
1451 splt = bfd_get_linker_section (dynobj, ".plt");
1452 BFD_ASSERT (splt != NULL);
1454 splt->contents = (bfd_byte *) bfd_zalloc (dynobj, splt->size);
1455 if (splt->contents == NULL)
1463 /* Handle relaxing. */
1465 /* A subroutine of rl78_elf_relax_section. If the global symbol H
1466 is within the low 64k, remove any entry for it in the plt. */
1468 struct relax_plt_data
1475 rl78_relax_plt_check (struct elf_link_hash_entry *h, void * xdata)
1477 struct relax_plt_data *data = (struct relax_plt_data *) xdata;
1479 if (h->plt.offset != (bfd_vma) -1)
1483 if (h->root.type == bfd_link_hash_undefined
1484 || h->root.type == bfd_link_hash_undefweak)
1487 address = (h->root.u.def.section->output_section->vma
1488 + h->root.u.def.section->output_offset
1489 + h->root.u.def.value);
1491 if (valid_16bit_address (address))
1494 data->splt->size -= 4;
1495 *data->again = TRUE;
1502 /* A subroutine of rl78_elf_relax_section. If the global symbol H
1503 previously had a plt entry, give it a new entry offset. */
1506 rl78_relax_plt_realloc (struct elf_link_hash_entry *h, void * xdata)
1508 bfd_vma *entry = (bfd_vma *) xdata;
1510 if (h->plt.offset != (bfd_vma) -1)
1512 h->plt.offset = *entry;
1520 rl78_elf_relax_plt_section (bfd *dynobj,
1522 struct bfd_link_info *info,
1525 struct relax_plt_data relax_plt_data;
1528 /* Assume nothing changes. */
1531 if (info->relocatable)
1534 /* We only relax the .plt section at the moment. */
1535 if (dynobj != elf_hash_table (info)->dynobj
1536 || strcmp (splt->name, ".plt") != 0)
1539 /* Quick check for an empty plt. */
1540 if (splt->size == 0)
1543 /* Map across all global symbols; see which ones happen to
1544 fall in the low 64k. */
1545 relax_plt_data.splt = splt;
1546 relax_plt_data.again = again;
1547 elf_link_hash_traverse (elf_hash_table (info), rl78_relax_plt_check,
1550 /* Likewise for local symbols, though that's somewhat less convenient
1551 as we have to walk the list of input bfds and swap in symbol data. */
1552 for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1554 bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1555 Elf_Internal_Shdr *symtab_hdr;
1556 Elf_Internal_Sym *isymbuf = NULL;
1559 if (! local_plt_offsets)
1562 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1563 if (symtab_hdr->sh_info != 0)
1565 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1566 if (isymbuf == NULL)
1567 isymbuf = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
1568 symtab_hdr->sh_info, 0,
1570 if (isymbuf == NULL)
1574 for (idx = 0; idx < symtab_hdr->sh_info; ++idx)
1576 Elf_Internal_Sym *isym;
1580 if (local_plt_offsets[idx] == (bfd_vma) -1)
1583 isym = &isymbuf[idx];
1584 if (isym->st_shndx == SHN_UNDEF)
1586 else if (isym->st_shndx == SHN_ABS)
1587 tsec = bfd_abs_section_ptr;
1588 else if (isym->st_shndx == SHN_COMMON)
1589 tsec = bfd_com_section_ptr;
1591 tsec = bfd_section_from_elf_index (ibfd, isym->st_shndx);
1593 address = (tsec->output_section->vma
1594 + tsec->output_offset
1596 if (valid_16bit_address (address))
1598 local_plt_offsets[idx] = -1;
1605 && symtab_hdr->contents != (unsigned char *) isymbuf)
1607 if (! info->keep_memory)
1611 /* Cache the symbols for elf_link_input_bfd. */
1612 symtab_hdr->contents = (unsigned char *) isymbuf;
1617 /* If we changed anything, walk the symbols again to reallocate
1618 .plt entry addresses. */
1619 if (*again && splt->size > 0)
1623 elf_link_hash_traverse (elf_hash_table (info),
1624 rl78_relax_plt_realloc, &entry);
1626 for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1628 bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1629 unsigned int nlocals = elf_tdata (ibfd)->symtab_hdr.sh_info;
1632 if (! local_plt_offsets)
1635 for (idx = 0; idx < nlocals; ++idx)
1636 if (local_plt_offsets[idx] != (bfd_vma) -1)
1638 local_plt_offsets[idx] = entry;
1647 /* Delete some bytes from a section while relaxing. */
1650 elf32_rl78_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count,
1651 Elf_Internal_Rela *alignment_rel, int force_snip)
1653 Elf_Internal_Shdr * symtab_hdr;
1654 unsigned int sec_shndx;
1655 bfd_byte * contents;
1656 Elf_Internal_Rela * irel;
1657 Elf_Internal_Rela * irelend;
1658 Elf_Internal_Sym * isym;
1659 Elf_Internal_Sym * isymend;
1661 unsigned int symcount;
1662 struct elf_link_hash_entry ** sym_hashes;
1663 struct elf_link_hash_entry ** end_hashes;
1668 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1670 contents = elf_section_data (sec)->this_hdr.contents;
1672 /* The deletion must stop at the next alignment boundary, if
1673 ALIGNMENT_REL is non-NULL. */
1676 toaddr = alignment_rel->r_offset;
1678 irel = elf_section_data (sec)->relocs;
1681 _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL, TRUE);
1682 irel = elf_section_data (sec)->relocs;
1685 irelend = irel + sec->reloc_count;
1687 /* Actually delete the bytes. */
1688 memmove (contents + addr, contents + addr + count,
1689 (size_t) (toaddr - addr - count));
1691 /* If we don't have an alignment marker to worry about, we can just
1692 shrink the section. Otherwise, we have to fill in the newly
1693 created gap with NOP insns (0x03). */
1697 memset (contents + toaddr - count, 0x03, count);
1699 /* Adjust all the relocs. */
1700 for (; irel && irel < irelend; irel++)
1702 /* Get the new reloc address. */
1703 if (irel->r_offset > addr
1704 && (irel->r_offset < toaddr
1705 || (force_snip && irel->r_offset == toaddr)))
1706 irel->r_offset -= count;
1708 /* If we see an ALIGN marker at the end of the gap, we move it
1709 to the beginning of the gap, since marking these gaps is what
1711 if (irel->r_offset == toaddr
1712 && ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
1713 && irel->r_addend & RL78_RELAXA_ALIGN)
1714 irel->r_offset -= count;
1717 /* Adjust the local symbols defined in this section. */
1718 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1719 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1720 isymend = isym + symtab_hdr->sh_info;
1722 for (; isym < isymend; isym++)
1724 /* If the symbol is in the range of memory we just moved, we
1725 have to adjust its value. */
1726 if (isym->st_shndx == sec_shndx
1727 && isym->st_value > addr
1728 && isym->st_value < toaddr)
1729 isym->st_value -= count;
1731 /* If the symbol *spans* the bytes we just deleted (i.e. it's
1732 *end* is in the moved bytes but it's *start* isn't), then we
1733 must adjust its size. */
1734 if (isym->st_shndx == sec_shndx
1735 && isym->st_value < addr
1736 && isym->st_value + isym->st_size > addr
1737 && isym->st_value + isym->st_size < toaddr)
1738 isym->st_size -= count;
1741 /* Now adjust the global symbols defined in this section. */
1742 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1743 - symtab_hdr->sh_info);
1744 sym_hashes = elf_sym_hashes (abfd);
1745 end_hashes = sym_hashes + symcount;
1747 for (; sym_hashes < end_hashes; sym_hashes++)
1749 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1751 if ((sym_hash->root.type == bfd_link_hash_defined
1752 || sym_hash->root.type == bfd_link_hash_defweak)
1753 && sym_hash->root.u.def.section == sec)
1755 /* As above, adjust the value if needed. */
1756 if (sym_hash->root.u.def.value > addr
1757 && sym_hash->root.u.def.value < toaddr)
1758 sym_hash->root.u.def.value -= count;
1760 /* As above, adjust the size if needed. */
1761 if (sym_hash->root.u.def.value < addr
1762 && sym_hash->root.u.def.value + sym_hash->size > addr
1763 && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1764 sym_hash->size -= count;
1771 /* Used to sort relocs by address. If relocs have the same address,
1772 we maintain their relative order, except that R_RL78_RH_RELAX
1773 alignment relocs must be the first reloc for any given address. */
1776 reloc_bubblesort (Elf_Internal_Rela * r, int count)
1780 bfd_boolean swappit;
1782 /* This is almost a classic bubblesort. It's the slowest sort, but
1783 we're taking advantage of the fact that the relocations are
1784 mostly in order already (the assembler emits them that way) and
1785 we need relocs with the same address to remain in the same
1791 for (i = 0; i < count - 1; i ++)
1793 if (r[i].r_offset > r[i + 1].r_offset)
1795 else if (r[i].r_offset < r[i + 1].r_offset)
1797 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
1798 && (r[i + 1].r_addend & RL78_RELAXA_ALIGN))
1800 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
1801 && (r[i + 1].r_addend & RL78_RELAXA_ELIGN)
1802 && !(ELF32_R_TYPE (r[i].r_info) == R_RL78_RH_RELAX
1803 && (r[i].r_addend & RL78_RELAXA_ALIGN)))
1810 Elf_Internal_Rela tmp;
1815 /* If we do move a reloc back, re-scan to see if it
1816 needs to be moved even further back. This avoids
1817 most of the O(n^2) behavior for our cases. */
1827 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
1828 rl78_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1829 lrel, abfd, sec, link_info, scale)
1832 rl78_offset_for_reloc (bfd * abfd,
1833 Elf_Internal_Rela * rel,
1834 Elf_Internal_Shdr * symtab_hdr,
1835 Elf_External_Sym_Shndx * shndx_buf ATTRIBUTE_UNUSED,
1836 Elf_Internal_Sym * intsyms,
1837 Elf_Internal_Rela ** lrel,
1839 asection * input_section,
1840 struct bfd_link_info * info,
1847 /* REL is the first of 1..N relocations. We compute the symbol
1848 value for each relocation, then combine them if needed. LREL
1849 gets a pointer to the last relocation used. */
1852 unsigned long r_type;
1854 /* Get the value of the symbol referred to by the reloc. */
1855 if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1857 /* A local symbol. */
1858 Elf_Internal_Sym *isym;
1861 isym = intsyms + ELF32_R_SYM (rel->r_info);
1863 if (isym->st_shndx == SHN_UNDEF)
1864 ssec = bfd_und_section_ptr;
1865 else if (isym->st_shndx == SHN_ABS)
1866 ssec = bfd_abs_section_ptr;
1867 else if (isym->st_shndx == SHN_COMMON)
1868 ssec = bfd_com_section_ptr;
1870 ssec = bfd_section_from_elf_index (abfd,
1873 /* Initial symbol value. */
1874 symval = isym->st_value;
1876 /* GAS may have made this symbol relative to a section, in
1877 which case, we have to add the addend to find the
1879 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
1880 symval += rel->r_addend;
1884 if ((ssec->flags & SEC_MERGE)
1885 && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
1886 symval = _bfd_merged_section_offset (abfd, & ssec,
1887 elf_section_data (ssec)->sec_info,
1891 /* Now make the offset relative to where the linker is putting it. */
1894 ssec->output_section->vma + ssec->output_offset;
1896 symval += rel->r_addend;
1901 struct elf_link_hash_entry * h;
1903 /* An external symbol. */
1904 indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1905 h = elf_sym_hashes (abfd)[indx];
1906 BFD_ASSERT (h != NULL);
1908 if (h->root.type != bfd_link_hash_defined
1909 && h->root.type != bfd_link_hash_defweak)
1911 /* This appears to be a reference to an undefined
1912 symbol. Just ignore it--it will be caught by the
1913 regular reloc processing. */
1919 symval = (h->root.u.def.value
1920 + h->root.u.def.section->output_section->vma
1921 + h->root.u.def.section->output_offset);
1923 symval += rel->r_addend;
1926 r_type = ELF32_R_TYPE (rel->r_info);
1930 (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1933 case R_RL78_OPromtop:
1934 symval = get_romstart (NULL, info, input_bfd, input_section, rel->r_offset);
1935 (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1938 case R_RL78_OPramtop:
1939 symval = get_ramstart (NULL, info, input_bfd, input_section, rel->r_offset);
1940 (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1950 case R_RL78_OPsctsize:
1951 case R_RL78_OPscttop:
1957 (void) rl78_compute_complex_reloc (r_type, 0, input_section);
1960 case R_RL78_DIR16UL:
1962 case R_RL78_ABS16UL:
1965 goto reloc_computes_value;
1967 case R_RL78_DIR16UW:
1969 case R_RL78_ABS16UW:
1972 goto reloc_computes_value;
1975 reloc_computes_value:
1976 symval = rl78_compute_complex_reloc (r_type, 0, input_section);
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 (link_info->relocatable
2091 || (sec->flags & SEC_RELOC) == 0
2092 || sec->reloc_count == 0
2093 || (sec->flags & SEC_CODE) == 0)
2096 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2097 shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
2099 /* Get the section contents. */
2100 if (elf_section_data (sec)->this_hdr.contents != NULL)
2101 contents = elf_section_data (sec)->this_hdr.contents;
2102 /* Go get them off disk. */
2105 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2107 elf_section_data (sec)->this_hdr.contents = contents;
2110 /* Read this BFD's symbols. */
2111 /* Get cached copy if it exists. */
2112 if (symtab_hdr->contents != NULL)
2113 intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
2116 intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
2117 symtab_hdr->contents = (bfd_byte *) intsyms;
2120 if (shndx_hdr->sh_size != 0)
2124 amt = symtab_hdr->sh_info;
2125 amt *= sizeof (Elf_External_Sym_Shndx);
2126 shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
2127 if (shndx_buf == NULL)
2129 if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
2130 || bfd_bread (shndx_buf, amt, abfd) != amt)
2132 shndx_hdr->contents = (bfd_byte *) shndx_buf;
2135 /* Get a copy of the native relocations. */
2136 internal_relocs = (_bfd_elf_link_read_relocs
2137 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2138 link_info->keep_memory));
2139 if (internal_relocs == NULL)
2141 if (! link_info->keep_memory)
2142 free_relocs = internal_relocs;
2144 /* The RL_ relocs must be just before the operand relocs they go
2145 with, so we must sort them to guarantee this. We use bubblesort
2146 instead of qsort so we can guarantee that relocs with the same
2147 address remain in the same relative order. */
2148 reloc_bubblesort (internal_relocs, sec->reloc_count);
2150 /* Walk through them looking for relaxing opportunities. */
2151 irelend = internal_relocs + sec->reloc_count;
2154 /* This will either be NULL or a pointer to the next alignment
2156 next_alignment = internal_relocs;
2158 /* We calculate worst case shrinkage caused by alignment directives.
2159 No fool-proof, but better than either ignoring the problem or
2160 doing heavy duty analysis of all the alignment markers in all
2162 section_alignment_glue = 0;
2163 for (irel = internal_relocs; irel < irelend; irel++)
2164 if (ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
2165 && irel->r_addend & RL78_RELAXA_ALIGN)
2167 int this_glue = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
2169 if (section_alignment_glue < this_glue)
2170 section_alignment_glue = this_glue;
2172 /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
2174 section_alignment_glue *= 2;
2176 for (irel = internal_relocs; irel < irelend; irel++)
2178 unsigned char *insn;
2181 /* The insns we care about are all marked with one of these. */
2182 if (ELF32_R_TYPE (irel->r_info) != R_RL78_RH_RELAX)
2185 if (irel->r_addend & RL78_RELAXA_ALIGN
2186 || next_alignment == internal_relocs)
2188 /* When we delete bytes, we need to maintain all the alignments
2189 indicated. In addition, we need to be careful about relaxing
2190 jumps across alignment boundaries - these displacements
2191 *grow* when we delete bytes. For now, don't shrink
2192 displacements across an alignment boundary, just in case.
2193 Note that this only affects relocations to the same
2195 next_alignment += 2;
2196 while (next_alignment < irelend
2197 && (ELF32_R_TYPE (next_alignment->r_info) != R_RL78_RH_RELAX
2198 || !(next_alignment->r_addend & RL78_RELAXA_ELIGN)))
2200 if (next_alignment >= irelend || next_alignment->r_offset == 0)
2201 next_alignment = NULL;
2204 /* When we hit alignment markers, see if we've shrunk enough
2205 before them to reduce the gap without violating the alignment
2207 if (irel->r_addend & RL78_RELAXA_ALIGN)
2209 /* At this point, the next relocation *should* be the ELIGN
2211 Elf_Internal_Rela *erel = irel + 1;
2212 unsigned int alignment, nbytes;
2214 if (ELF32_R_TYPE (erel->r_info) != R_RL78_RH_RELAX)
2216 if (!(erel->r_addend & RL78_RELAXA_ELIGN))
2219 alignment = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
2221 if (erel->r_offset - irel->r_offset < alignment)
2224 nbytes = erel->r_offset - irel->r_offset;
2225 nbytes /= alignment;
2226 nbytes *= alignment;
2228 elf32_rl78_relax_delete_bytes (abfd, sec, erel->r_offset - nbytes, nbytes,
2229 next_alignment, erel->r_offset == sec->size);
2235 if (irel->r_addend & RL78_RELAXA_ELIGN)
2238 insn = contents + irel->r_offset;
2240 nrelocs = irel->r_addend & RL78_RELAXA_RNUM;
2242 /* At this point, we have an insn that is a candidate for linker
2243 relaxation. There are NRELOCS relocs following that may be
2244 relaxed, although each reloc may be made of more than one
2245 reloc entry (such as gp-rel symbols). */
2247 /* Get the value of the symbol referred to by the reloc. Just
2248 in case this is the last reloc in the list, use the RL's
2249 addend to choose between this reloc (no addend) or the next
2250 (yes addend, which means at least one following reloc). */
2252 /* srel points to the "current" reloction for this insn -
2253 actually the last reloc for a given operand, which is the one
2254 we need to update. We check the relaxations in the same
2255 order that the relocations happen, so we'll just push it
2259 pc = sec->output_section->vma + sec->output_offset
2263 BFD_ASSERT (nrelocs > 0); \
2264 symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \
2265 pcrel = symval - pc + srel->r_addend; \
2268 #define SNIPNR(offset, nbytes) \
2269 elf32_rl78_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0);
2271 #define SNIP(offset, nbytes, newtype) \
2272 SNIPNR (offset, nbytes); \
2273 srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2275 /* The order of these bit tests must match the order that the
2276 relocs appear in. Since we sorted those by offset, we can
2279 /*----------------------------------------------------------------------*/
2280 /* EF ad BR $rel8 pcrel
2281 ED al ah BR !abs16 abs
2282 EE al ah BR $!rel16 pcrel
2283 EC al ah as BR !!abs20 abs
2285 FD al ah CALL !abs16 abs
2286 FE al ah CALL $!rel16 pcrel
2287 FC al ah as CALL !!abs20 abs
2295 61 C8 EF ad SKC ; BR $rel8
2296 61 D8 EF ad SKNC ; BR $rel8
2297 61 E8 EF ad SKZ ; BR $rel8
2298 61 F8 EF ad SKNZ ; BR $rel8
2299 61 E3 EF ad SKH ; BR $rel8
2300 61 F3 EF ad SKNH ; BR $rel8
2303 if ((irel->r_addend & RL78_RELAXA_MASK) == RL78_RELAXA_BRA)
2305 /* SKIP opcodes that skip non-branches will have a relax tag
2306 but no corresponding symbol to relax against; we just
2308 if (irel->r_addend & RL78_RELAXA_RNUM)
2315 case 0xec: /* BR !!abs20 */
2322 SNIP (2, 2, R_RL78_DIR8S_PCREL);
2325 else if (symval < 65536)
2328 insn[1] = symval & 0xff;
2329 insn[2] = symval >> 8;
2330 SNIP (2, 1, R_RL78_DIR16S);
2333 else if (pcrel < 32767
2337 insn[1] = pcrel & 0xff;
2338 insn[2] = pcrel >> 8;
2339 SNIP (2, 1, R_RL78_DIR16S_PCREL);
2344 case 0xee: /* BR $!pcrel16 */
2345 case 0xed: /* BR $!abs16 */
2351 SNIP (2, 1, R_RL78_DIR8S_PCREL);
2356 case 0xfc: /* CALL !!abs20 */
2360 insn[1] = symval & 0xff;
2361 insn[2] = symval >> 8;
2362 SNIP (2, 1, R_RL78_DIR16S);
2365 else if (pcrel < 32767
2369 insn[1] = pcrel & 0xff;
2370 insn[2] = pcrel >> 8;
2371 SNIP (2, 1, R_RL78_DIR16S_PCREL);
2376 case 0x61: /* PREFIX */
2377 /* For SKIP/BR, we change the BR opcode and delete the
2378 SKIP. That way, we don't have to find and change the
2379 relocation for the BR. */
2380 /* Note that, for the case where we're skipping some
2381 other insn, we have no "other" reloc but that's safe
2385 case 0xc8: /* SKC */
2386 if (insn[2] == 0xef)
2388 insn[2] = 0xde; /* BNC */
2393 case 0xd8: /* SKNC */
2394 if (insn[2] == 0xef)
2396 insn[2] = 0xdc; /* BC */
2401 case 0xe8: /* SKZ */
2402 if (insn[2] == 0xef)
2404 insn[2] = 0xdf; /* BNZ */
2409 case 0xf8: /* SKNZ */
2410 if (insn[2] == 0xef)
2412 insn[2] = 0xdd; /* BZ */
2417 case 0xe3: /* SKH */
2418 if (insn[2] == 0xef)
2420 insn[2] = 0xd3; /* BNH */
2421 SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2425 case 0xf3: /* SKNH */
2426 if (insn[2] == 0xef)
2428 insn[2] = 0xc3; /* BH */
2429 SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2437 if ((irel->r_addend & RL78_RELAXA_MASK) == RL78_RELAXA_ADDR16
2440 /*----------------------------------------------------------------------*/
2441 /* Some insns have both a 16-bit address operand and an 8-bit
2442 variant if the address is within a special range:
2444 Address 16-bit operand SADDR range SFR range
2445 FFF00-FFFFF 0xff00-0xffff 0x00-0xff
2446 FFE20-FFF1F 0xfe20-0xff1f 0x00-0xff
2448 The RELAX_ADDR16[] array has the insn encodings for the
2449 16-bit operand version, as well as the SFR and SADDR
2450 variants. We only need to replace the encodings and
2453 Note: we intentionally do not attempt to decode and skip
2454 any ES: prefix, as adding ES: means the addr16 (likely)
2455 no longer points to saddr/sfr space.
2465 if (0xffe20 <= symval && symval <= 0xfffff)
2468 is_saddr = (0xffe20 <= symval && symval <= 0xfff1f);
2469 is_sfr = (0xfff00 <= symval && symval <= 0xfffff);
2471 for (idx = 0; relax_addr16[idx].insn != -1; idx ++)
2473 if (relax_addr16[idx].prefix != -1
2474 && insn[0] == relax_addr16[idx].prefix
2475 && insn[1] == relax_addr16[idx].insn)
2479 else if (relax_addr16[idx].prefix == -1
2480 && insn[0] == relax_addr16[idx].insn)
2487 /* We have a matched insn, and poff is 0 or 1 depending
2488 on the base pattern size. */
2490 if (is_sfr && relax_addr16[idx].insn_for_sfr != -1)
2492 insn[poff] = relax_addr16[idx].insn_for_sfr;
2493 SNIP (poff+2, 1, R_RL78_RH_SFR);
2496 else if (is_saddr && relax_addr16[idx].insn_for_saddr != -1)
2498 insn[poff] = relax_addr16[idx].insn_for_saddr;
2499 SNIP (poff+2, 1, R_RL78_RH_SADDR);
2504 /*----------------------------------------------------------------------*/
2510 if (free_relocs != NULL)
2513 if (free_contents != NULL)
2514 free (free_contents);
2516 if (shndx_buf != NULL)
2518 shndx_hdr->contents = NULL;
2522 if (free_intsyms != NULL)
2523 free (free_intsyms);
2530 #define ELF_ARCH bfd_arch_rl78
2531 #define ELF_MACHINE_CODE EM_RL78
2532 #define ELF_MAXPAGESIZE 0x1000
2534 #define TARGET_LITTLE_SYM rl78_elf32_vec
2535 #define TARGET_LITTLE_NAME "elf32-rl78"
2537 #define elf_info_to_howto_rel NULL
2538 #define elf_info_to_howto rl78_info_to_howto_rela
2539 #define elf_backend_object_p rl78_elf_object_p
2540 #define elf_backend_relocate_section rl78_elf_relocate_section
2541 #define elf_symbol_leading_char ('_')
2542 #define elf_backend_can_gc_sections 1
2544 #define bfd_elf32_bfd_reloc_type_lookup rl78_reloc_type_lookup
2545 #define bfd_elf32_bfd_reloc_name_lookup rl78_reloc_name_lookup
2546 #define bfd_elf32_bfd_set_private_flags rl78_elf_set_private_flags
2547 #define bfd_elf32_bfd_merge_private_bfd_data rl78_elf_merge_private_bfd_data
2548 #define bfd_elf32_bfd_print_private_bfd_data rl78_elf_print_private_bfd_data
2550 #define bfd_elf32_bfd_relax_section rl78_elf_relax_section
2551 #define elf_backend_check_relocs rl78_elf_check_relocs
2552 #define elf_backend_always_size_sections \
2553 rl78_elf_always_size_sections
2554 #define elf_backend_finish_dynamic_sections \
2555 rl78_elf_finish_dynamic_sections
2557 #include "elf32-target.h"