1 /* Renesas RL78 specific support for 32-bit ELF.
2 Copyright (C) 2011-2024 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
26 #include "libiberty.h"
28 #define valid_16bit_address(v) ((v) <= 0x0ffff || (v) >= 0xf0000)
30 #define RL78REL(n,sz,bit,mask,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, mask, false)
34 static bfd_reloc_status_type
rl78_special_reloc (bfd
*, arelent
*, asymbol
*, void *,
35 asection
*, bfd
*, char **);
37 #define RL78_OP_REL(n,sz,bit,mask,shift,complain,pcrel) \
38 HOWTO (R_RL78_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
39 rl78_special_reloc, "R_RL78_" #n, false, 0, mask, false)
41 /* Note that the relocations around 0x7f are internal to this file;
42 feel free to move them as needed to avoid conflicts with published
43 relocation numbers. */
45 static reloc_howto_type rl78_elf_howto_table
[] =
47 RL78REL (NONE
, 0, 0, 0, 0, dont
, false),
48 RL78REL (DIR32
, 4, 32, 0xffffffff, 0, dont
, false),
49 RL78REL (DIR24S
, 4, 24, 0xffffff, 0, signed, false),
50 RL78REL (DIR16
, 2, 16, 0xffff, 0, bitfield
, false),
51 RL78REL (DIR16U
, 2, 16, 0xffff, 0, unsigned, false),
52 RL78REL (DIR16S
, 2, 16, 0xffff, 0, bitfield
, false),
53 RL78REL (DIR8
, 1, 8, 0xff, 0, dont
, false),
54 RL78REL (DIR8U
, 1, 8, 0xff, 0, unsigned, false),
55 RL78REL (DIR8S
, 1, 8, 0xff, 0, bitfield
, false),
56 RL78REL (DIR24S_PCREL
, 4, 24, 0xffffff, 0, signed, true),
57 RL78REL (DIR16S_PCREL
, 2, 16, 0xffff, 0, signed, true),
58 RL78REL (DIR8S_PCREL
, 1, 8, 0xff, 0, signed, true),
59 RL78REL (DIR16UL
, 2, 16, 0xffff, 2, unsigned, false),
60 RL78REL (DIR16UW
, 2, 16, 0xffff, 1, unsigned, false),
61 RL78REL (DIR8UL
, 1, 8, 0xff, 2, unsigned, false),
62 RL78REL (DIR8UW
, 1, 8, 0xff, 1, unsigned, false),
63 RL78REL (DIR32_REV
, 4, 32, 0xffffffff, 0, dont
, false),
64 RL78REL (DIR16_REV
, 2, 16, 0xffff, 0, bitfield
, false),
65 RL78REL (DIR3U_PCREL
, 1, 3, 0x7, 0, unsigned, true),
95 RL78REL (RH_RELAX
, 0, 0, 0, 0, dont
, false),
96 RL78REL (RH_SFR
, 1, 8, 0xff, 0, unsigned, false),
97 RL78REL (RH_SADDR
, 1, 8, 0xff, 0, unsigned, false),
117 RL78_OP_REL (ABS32
, 4, 32, 0xffffffff, 0, dont
, false),
118 RL78_OP_REL (ABS24S
, 4, 24, 0xffffff, 0, signed, false),
119 RL78_OP_REL (ABS16
, 2, 16, 0xffff, 0, bitfield
, false),
120 RL78_OP_REL (ABS16U
, 2, 16, 0xffff, 0, unsigned, false),
121 RL78_OP_REL (ABS16S
, 2, 16, 0xffff, 0, signed, false),
122 RL78_OP_REL (ABS8
, 1, 8, 0xff, 0, bitfield
, false),
123 RL78_OP_REL (ABS8U
, 1, 8, 0xff, 0, unsigned, false),
124 RL78_OP_REL (ABS8S
, 1, 8, 0xff, 0, signed, false),
125 RL78_OP_REL (ABS24S_PCREL
, 4, 24, 0xffffff, 0, signed, true),
126 RL78_OP_REL (ABS16S_PCREL
, 2, 16, 0xffff, 0, signed, true),
127 RL78_OP_REL (ABS8S_PCREL
, 1, 8, 0xff, 0, signed, true),
128 RL78_OP_REL (ABS16UL
, 2, 16, 0xffff, 0, unsigned, false),
129 RL78_OP_REL (ABS16UW
, 2, 16, 0xffff, 0, unsigned, false),
130 RL78_OP_REL (ABS8UL
, 1, 8, 0xff, 0, unsigned, false),
131 RL78_OP_REL (ABS8UW
, 1, 8, 0xff, 0, unsigned, false),
132 RL78_OP_REL (ABS32_REV
, 4, 32, 0xffffffff, 0, dont
, false),
133 RL78_OP_REL (ABS16_REV
, 2, 16, 0xffff, 0, bitfield
, false),
135 #define STACK_REL_P(x) ((x) <= R_RL78_ABS16_REV && (x) >= R_RL78_ABS32)
185 RL78_OP_REL (SYM
, 0, 0, 0, 0, dont
, false),
186 RL78_OP_REL (OPneg
, 0, 0, 0, 0, dont
, false),
187 RL78_OP_REL (OPadd
, 0, 0, 0, 0, dont
, false),
188 RL78_OP_REL (OPsub
, 0, 0, 0, 0, dont
, false),
189 RL78_OP_REL (OPmul
, 0, 0, 0, 0, dont
, false),
190 RL78_OP_REL (OPdiv
, 0, 0, 0, 0, dont
, false),
191 RL78_OP_REL (OPshla
, 0, 0, 0, 0, dont
, false),
192 RL78_OP_REL (OPshra
, 0, 0, 0, 0, dont
, false),
193 RL78_OP_REL (OPsctsize
, 0, 0, 0, 0, dont
, false),
198 RL78_OP_REL (OPscttop
, 0, 0, 0, 0, dont
, false),
201 RL78_OP_REL (OPand
, 0, 0, 0, 0, dont
, false),
202 RL78_OP_REL (OPor
, 0, 0, 0, 0, dont
, false),
203 RL78_OP_REL (OPxor
, 0, 0, 0, 0, dont
, false),
204 RL78_OP_REL (OPnot
, 0, 0, 0, 0, dont
, false),
205 RL78_OP_REL (OPmod
, 0, 0, 0, 0, dont
, false),
206 RL78_OP_REL (OPromtop
, 0, 0, 0, 0, dont
, false),
207 RL78_OP_REL (OPramtop
, 0, 0, 0, 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
,
283 Elf_Internal_Rela
* dst
)
287 r_type
= ELF32_R_TYPE (dst
->r_info
);
288 if (r_type
>= (unsigned int) R_RL78_max
)
290 /* xgettext:c-format */
291 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
293 bfd_set_error (bfd_error_bad_value
);
296 cache_ptr
->howto
= rl78_elf_howto_table
+ r_type
;
301 get_symbol_value (const char * name
,
302 struct bfd_link_info
* info
,
304 asection
* input_section
,
307 struct bfd_link_hash_entry
* h
;
312 h
= bfd_link_hash_lookup (info
->hash
, name
, false, false, true);
315 || (h
->type
!= bfd_link_hash_defined
316 && h
->type
!= bfd_link_hash_defweak
))
318 (*info
->callbacks
->undefined_symbol
)
319 (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 (struct bfd_link_info
* info
,
334 static bool cached
= false;
335 static bfd_vma cached_value
= 0;
339 cached_value
= get_symbol_value ("_start", info
, abfd
, sec
, offset
);
346 get_ramstart (struct bfd_link_info
* info
,
351 static bool cached
= false;
352 static bfd_vma cached_value
= 0;
356 cached_value
= get_symbol_value ("__datastart", info
, abfd
, sec
, offset
);
362 #define NUM_STACK_ENTRIES 16
363 static int32_t rl78_stack
[ NUM_STACK_ENTRIES
];
364 static unsigned int rl78_stack_top
;
367 rl78_stack_push (bfd_vma val
, bfd_reloc_status_type
*r
)
369 if (rl78_stack_top
< NUM_STACK_ENTRIES
)
370 rl78_stack
[rl78_stack_top
++] = val
;
372 *r
= bfd_reloc_dangerous
;
375 static inline bfd_vma
376 rl78_stack_pop (bfd_reloc_status_type
*r
)
378 if (rl78_stack_top
> 0)
379 return rl78_stack
[-- rl78_stack_top
];
381 *r
= bfd_reloc_dangerous
;
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
,
394 bfd_reloc_status_type
*r
,
395 char **error_message
)
398 bfd_vma relocation
= 0;
399 bfd_reloc_status_type status
= bfd_reloc_ok
;
404 status
= bfd_reloc_notsupported
;
407 case R_RL78_ABS24S_PCREL
:
408 case R_RL78_ABS16S_PCREL
:
409 case R_RL78_ABS8S_PCREL
:
410 relocation
= rl78_stack_pop (&status
);
411 relocation
-= input_section
->output_section
->vma
+ input_section
->output_offset
;
415 case R_RL78_ABS32_REV
:
417 case R_RL78_ABS16_REV
:
423 relocation
= rl78_stack_pop (&status
);
428 relocation
= rl78_stack_pop (&status
) >> 2;
433 relocation
= rl78_stack_pop (&status
) >> 1;
436 /* The rest of the relocs compute values and then push them onto the stack. */
437 case R_RL78_OPramtop
:
438 case R_RL78_OPromtop
:
440 rl78_stack_push (symval
, &status
);
444 tmp1
= rl78_stack_pop (&status
);
446 rl78_stack_push (tmp1
, &status
);
450 tmp2
= rl78_stack_pop (&status
);
451 tmp1
= rl78_stack_pop (&status
);
453 rl78_stack_push (tmp1
, &status
);
457 /* For the expression "A - B", the assembler pushes A,
458 then B, then OPSUB. So the first op we pop is B, not A. */
459 tmp2
= rl78_stack_pop (&status
); /* B */
460 tmp1
= rl78_stack_pop (&status
); /* A */
461 tmp1
-= tmp2
; /* A - B */
462 rl78_stack_push (tmp1
, &status
);
466 tmp2
= rl78_stack_pop (&status
);
467 tmp1
= rl78_stack_pop (&status
);
469 rl78_stack_push (tmp1
, &status
);
473 tmp2
= rl78_stack_pop (&status
);
474 tmp1
= rl78_stack_pop (&status
);
480 status
= bfd_reloc_overflow
;
482 rl78_stack_push (tmp1
, &status
);
486 tmp2
= rl78_stack_pop (&status
);
487 tmp1
= rl78_stack_pop (&status
);
489 rl78_stack_push (tmp1
, &status
);
493 tmp2
= rl78_stack_pop (&status
);
494 tmp1
= rl78_stack_pop (&status
);
496 rl78_stack_push (tmp1
, &status
);
499 case R_RL78_OPsctsize
:
500 rl78_stack_push (input_section
->size
, &status
);
503 case R_RL78_OPscttop
:
504 rl78_stack_push (input_section
->output_section
->vma
, &status
);
508 tmp2
= rl78_stack_pop (&status
);
509 tmp1
= rl78_stack_pop (&status
);
511 rl78_stack_push (tmp1
, &status
);
515 tmp2
= rl78_stack_pop (&status
);
516 tmp1
= rl78_stack_pop (&status
);
518 rl78_stack_push (tmp1
, &status
);
522 tmp2
= rl78_stack_pop (&status
);
523 tmp1
= rl78_stack_pop (&status
);
525 rl78_stack_push (tmp1
, &status
);
529 tmp1
= rl78_stack_pop (&status
);
531 rl78_stack_push (tmp1
, &status
);
535 tmp2
= rl78_stack_pop (&status
);
536 tmp1
= rl78_stack_pop (&status
);
542 status
= bfd_reloc_overflow
;
544 rl78_stack_push (tmp1
, &status
);
550 if (status
== bfd_reloc_dangerous
)
551 *error_message
= (_("RL78 reloc stack overflow/underflow"));
552 else if (status
== bfd_reloc_overflow
)
554 status
= bfd_reloc_dangerous
;
555 *error_message
= (_("RL78 reloc divide by zero"));
562 /* Check whether RELOCATION overflows a relocation field described by
565 static bfd_reloc_status_type
566 check_overflow (reloc_howto_type
*howto
, bfd_vma relocation
)
568 switch (howto
->complain_on_overflow
)
570 case complain_overflow_dont
:
573 case complain_overflow_bitfield
:
574 if ((bfd_signed_vma
) relocation
< -(1LL << (howto
->bitsize
- 1))
575 || (bfd_signed_vma
) relocation
>= 1LL << howto
->bitsize
)
576 return bfd_reloc_overflow
;
579 case complain_overflow_signed
:
580 if ((bfd_signed_vma
) relocation
< -(1LL << (howto
->bitsize
- 1))
581 || (bfd_signed_vma
) relocation
>= 1LL << (howto
->bitsize
- 1))
582 return bfd_reloc_overflow
;
585 case complain_overflow_unsigned
:
586 if (relocation
>= 1ULL << howto
->bitsize
)
587 return bfd_reloc_overflow
;
593 static bfd_reloc_status_type
594 rl78_special_reloc (bfd
* input_bfd
,
598 asection
* input_section
,
599 bfd
* output_bfd ATTRIBUTE_UNUSED
,
600 char ** error_message
)
602 bfd_reloc_status_type r
= bfd_reloc_ok
;
603 bfd_vma relocation
= 0;
604 unsigned long r_type
= reloc
->howto
->type
;
605 bfd_byte
* contents
= data
;
607 /* If necessary, compute the symbolic value of the relocation. */
611 relocation
= (symbol
->value
612 + symbol
->section
->output_section
->vma
613 + symbol
->section
->output_offset
617 case R_RL78_OPromtop
:
618 relocation
= get_romstart (NULL
, input_bfd
, input_section
,
622 case R_RL78_OPramtop
:
623 relocation
= get_ramstart (NULL
, input_bfd
, input_section
,
628 /* Get the value of the relocation. */
629 relocation
= rl78_compute_complex_reloc (r_type
, relocation
, input_section
,
632 if (STACK_REL_P (r_type
))
637 if (r
== bfd_reloc_ok
)
638 r
= check_overflow (reloc
->howto
, relocation
);
640 if (r_type
== R_RL78_ABS16_REV
)
641 relocation
= ((relocation
& 0xff) << 8) | ((relocation
>> 8) & 0xff);
642 else if (r_type
== R_RL78_ABS32_REV
)
643 relocation
= (((relocation
& 0xff) << 24)
644 | ((relocation
& 0xff00) << 8)
645 | ((relocation
>> 8) & 0xff00)
646 | ((relocation
>> 24) & 0xff));
648 limit
= bfd_get_section_limit_octets (input_bfd
, input_section
);
649 nbytes
= reloc
->howto
->bitsize
/ 8;
650 if (reloc
->address
< limit
651 && nbytes
<= limit
- reloc
->address
)
655 for (i
= 0; i
< nbytes
; i
++)
657 contents
[reloc
->address
+ i
] = relocation
;
662 r
= bfd_reloc_outofrange
;
668 #define OP(i) (contents[rel->r_offset + (i)])
670 /* Relocate an RL78 ELF section.
671 There is some attempt to make this function usable for many architectures,
672 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
673 if only to serve as a learning tool.
675 The RELOCATE_SECTION function is called by the new ELF backend linker
676 to handle the relocations for a section.
678 The relocs are always passed as Rela structures; if the section
679 actually uses Rel structures, the r_addend field will always be
682 This function is responsible for adjusting the section contents as
683 necessary, and (if using Rela relocs and generating a relocatable
684 output file) adjusting the reloc addend as necessary.
686 This function does not have to worry about setting the reloc
687 address or the reloc symbol index.
689 LOCAL_SYMS is a pointer to the swapped in local symbols.
691 LOCAL_SECTIONS is an array giving the section in the input file
692 corresponding to the st_shndx field of each local symbol.
694 The global hash table entry for the global symbols can be found
695 via elf_sym_hashes (input_bfd).
697 When generating relocatable output, this function must handle
698 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
699 going to be the section symbol corresponding to the output
700 section, which means that the addend must be adjusted
704 rl78_elf_relocate_section
706 struct bfd_link_info
* info
,
708 asection
* input_section
,
710 Elf_Internal_Rela
* relocs
,
711 Elf_Internal_Sym
* local_syms
,
712 asection
** local_sections
)
714 Elf_Internal_Shdr
* symtab_hdr
;
715 struct elf_link_hash_entry
** sym_hashes
;
716 Elf_Internal_Rela
* rel
;
717 Elf_Internal_Rela
* relend
;
721 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
722 sym_hashes
= elf_sym_hashes (input_bfd
);
723 relend
= relocs
+ input_section
->reloc_count
;
725 splt
= elf_hash_table (info
)->splt
;
727 for (rel
= relocs
; rel
< relend
; rel
++)
729 reloc_howto_type
*howto
;
730 unsigned long r_symndx
;
731 Elf_Internal_Sym
*sym
;
733 struct elf_link_hash_entry
*h
;
735 bfd_reloc_status_type r
;
736 const char *name
= NULL
;
737 bool unresolved_reloc
= true;
741 r_type
= ELF32_R_TYPE (rel
->r_info
);
742 r_symndx
= ELF32_R_SYM (rel
->r_info
);
744 howto
= rl78_elf_howto_table
+ ELF32_R_TYPE (rel
->r_info
);
750 if (r_symndx
< symtab_hdr
->sh_info
)
752 sym
= local_syms
+ r_symndx
;
753 sec
= local_sections
[r_symndx
];
754 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, & sec
, rel
);
756 name
= bfd_elf_string_from_elf_section
757 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
758 name
= sym
->st_name
== 0 ? bfd_section_name (sec
) : name
;
762 bool warned ATTRIBUTE_UNUSED
;
763 bool ignored ATTRIBUTE_UNUSED
;
765 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
766 r_symndx
, symtab_hdr
, sym_hashes
, h
,
767 sec
, relocation
, unresolved_reloc
,
770 name
= h
->root
.root
.string
;
773 if (sec
!= NULL
&& discarded_section (sec
))
774 RELOC_AGAINST_DISCARDED_SECTION (info
, input_bfd
, input_section
,
775 rel
, 1, relend
, howto
, 0, contents
);
777 if (bfd_link_relocatable (info
))
779 /* This is a relocatable link. We don't have to change
780 anything, unless the reloc is against a section symbol,
781 in which case we have to adjust according to where the
782 section symbol winds up in the output section. */
783 if (sym
!= NULL
&& ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
784 rel
->r_addend
+= sec
->output_offset
;
788 switch (ELF32_R_TYPE (rel
->r_info
))
795 plt_offset
= &h
->plt
.offset
;
797 plt_offset
= elf_local_got_offsets (input_bfd
) + r_symndx
;
799 if (! valid_16bit_address (relocation
))
801 /* If this is the first time we've processed this symbol,
802 fill in the plt entry with the correct symbol address. */
803 if ((*plt_offset
& 1) == 0)
807 x
= 0x000000ec; /* br !!abs24 */
808 x
|= (relocation
<< 8) & 0xffffff00;
809 bfd_put_32 (input_bfd
, x
, splt
->contents
+ *plt_offset
);
813 relocation
= (splt
->output_section
->vma
814 + splt
->output_offset
815 + (*plt_offset
& -2));
818 char *newname
= bfd_malloc (strlen(name
)+5);
819 strcpy (newname
, name
);
820 strcat(newname
, ".plt");
821 _bfd_generic_link_add_one_symbol (info
,
824 BSF_FUNCTION
| BSF_WEAK
,
837 if (h
!= NULL
&& h
->root
.type
== bfd_link_hash_undefweak
)
838 /* If the symbol is undefined and weak
839 then the relocation resolves to zero. */
843 if (howto
->pc_relative
)
845 relocation
-= (input_section
->output_section
->vma
846 + input_section
->output_offset
848 relocation
-= bfd_get_reloc_size (howto
);
851 relocation
+= rel
->r_addend
;
855 if (howto
->bitsize
!= 0
856 && (rel
->r_offset
>= input_section
->size
857 || ((howto
->bitsize
+ 7u) / 8
858 > input_section
->size
- rel
->r_offset
)))
859 r
= bfd_reloc_outofrange
;
866 case R_RL78_RH_RELAX
:
869 case R_RL78_DIR8S_PCREL
:
881 case R_RL78_DIR16S_PCREL
:
883 OP (1) = relocation
>> 8;
887 if ((relocation
& 0xf0000) == 0xf0000)
888 relocation
&= 0xffff;
890 OP (1) = relocation
>> 8;
895 OP (1) = relocation
>> 8;
900 OP (1) = relocation
>> 8;
903 case R_RL78_DIR16_REV
:
905 OP (0) = relocation
>> 8;
908 case R_RL78_DIR3U_PCREL
:
910 OP (0) |= relocation
& 0x07;
911 /* Map [3, 10] to [0, 7]. The code below using howto
912 bitsize will check for unsigned overflow. */
916 case R_RL78_DIR24S_PCREL
:
918 OP (1) = relocation
>> 8;
919 OP (2) = relocation
>> 16;
924 OP (1) = relocation
>> 8;
925 OP (2) = relocation
>> 16;
930 OP (1) = relocation
>> 8;
931 OP (2) = relocation
>> 16;
932 OP (3) = relocation
>> 24;
935 case R_RL78_DIR32_REV
:
937 OP (2) = relocation
>> 8;
938 OP (1) = relocation
>> 16;
939 OP (0) = relocation
>> 24;
943 relocation
-= 0xfff00;
947 case R_RL78_RH_SADDR
:
948 relocation
-= 0xffe20;
952 /* Complex reloc handling: */
954 case R_RL78_ABS32_REV
:
955 case R_RL78_ABS24S_PCREL
:
958 case R_RL78_ABS16_REV
:
959 case R_RL78_ABS16S_PCREL
:
968 case R_RL78_ABS8S_PCREL
:
977 case R_RL78_OPsctsize
:
978 case R_RL78_OPscttop
:
984 relocation
= rl78_compute_complex_reloc (r_type
, 0, input_section
,
991 OP (1) = relocation
>> 8;
992 OP (2) = relocation
>> 16;
993 OP (3) = relocation
>> 24;
996 case R_RL78_ABS32_REV
:
998 OP (2) = relocation
>> 8;
999 OP (1) = relocation
>> 16;
1000 OP (0) = relocation
>> 24;
1003 case R_RL78_ABS24S_PCREL
:
1005 OP (0) = relocation
;
1006 OP (1) = relocation
>> 8;
1007 OP (2) = relocation
>> 16;
1011 OP (0) = relocation
;
1012 OP (1) = relocation
>> 8;
1015 case R_RL78_ABS16_REV
:
1016 OP (1) = relocation
;
1017 OP (0) = relocation
>> 8;
1020 case R_RL78_ABS16S_PCREL
:
1022 OP (0) = relocation
;
1023 OP (1) = relocation
>> 8;
1027 case R_RL78_ABS16UL
:
1028 case R_RL78_ABS16UW
:
1029 OP (0) = relocation
;
1030 OP (1) = relocation
>> 8;
1034 OP (0) = relocation
;
1040 OP (0) = relocation
;
1043 case R_RL78_ABS8S_PCREL
:
1045 OP (0) = relocation
;
1054 if (r_symndx
< symtab_hdr
->sh_info
)
1055 relocation
= sec
->output_section
->vma
+ sec
->output_offset
1056 + sym
->st_value
+ rel
->r_addend
;
1058 && (h
->root
.type
== bfd_link_hash_defined
1059 || h
->root
.type
== bfd_link_hash_defweak
))
1060 relocation
= h
->root
.u
.def
.value
1061 + sec
->output_section
->vma
1062 + sec
->output_offset
1067 if (h
->root
.type
!= bfd_link_hash_undefweak
)
1069 (_("warning: RL78_SYM reloc with an unknown symbol"));
1071 (void) rl78_compute_complex_reloc (r_type
, relocation
, input_section
,
1072 &r
, &error_message
);
1075 case R_RL78_OPromtop
:
1076 relocation
= get_romstart (info
, input_bfd
, input_section
,
1078 (void) rl78_compute_complex_reloc (r_type
, relocation
, input_section
,
1079 &r
, &error_message
);
1082 case R_RL78_OPramtop
:
1083 relocation
= get_ramstart (info
, input_bfd
, input_section
,
1085 (void) rl78_compute_complex_reloc (r_type
, relocation
, input_section
,
1086 &r
, &error_message
);
1090 r
= bfd_reloc_notsupported
;
1094 if (r
== bfd_reloc_ok
)
1095 r
= check_overflow (howto
, relocation
);
1097 if (r
!= bfd_reloc_ok
)
1101 case bfd_reloc_overflow
:
1102 (*info
->callbacks
->reloc_overflow
)
1103 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
, (bfd_vma
) 0,
1104 input_bfd
, input_section
, rel
->r_offset
);
1107 case bfd_reloc_undefined
:
1108 (*info
->callbacks
->undefined_symbol
)
1109 (info
, name
, input_bfd
, input_section
, rel
->r_offset
, true);
1112 case bfd_reloc_outofrange
:
1113 /* xgettext:c-format */
1114 (*info
->callbacks
->einfo
)
1115 (_("%H: %s out of range\n"),
1116 input_bfd
, input_section
, rel
->r_offset
, howto
->name
);
1119 case bfd_reloc_notsupported
:
1120 /* xgettext:c-format */
1121 (*info
->callbacks
->einfo
)
1122 (_("%H: relocation type %u is not supported\n"),
1123 input_bfd
, input_section
, rel
->r_offset
, r_type
);
1126 case bfd_reloc_dangerous
:
1127 (*info
->callbacks
->reloc_dangerous
)
1128 (info
, error_message
, input_bfd
, input_section
, rel
->r_offset
);
1132 /* xgettext:c-format */
1133 (*info
->callbacks
->einfo
)
1134 (_("%H: relocation %s returns an unrecognized value %x\n"),
1135 input_bfd
, input_section
, rel
->r_offset
, howto
->name
, r
);
1145 /* Function to set the ELF flag bits. */
1148 rl78_elf_set_private_flags (bfd
* abfd
, flagword flags
)
1150 elf_elfheader (abfd
)->e_flags
= flags
;
1151 elf_flags_init (abfd
) = true;
1155 static bool no_warn_mismatch
= false;
1157 void bfd_elf32_rl78_set_target_flags (bool);
1160 bfd_elf32_rl78_set_target_flags (bool user_no_warn_mismatch
)
1162 no_warn_mismatch
= user_no_warn_mismatch
;
1166 rl78_cpu_name (flagword flags
)
1168 switch (flags
& E_FLAG_RL78_CPU_MASK
)
1171 case E_FLAG_RL78_G10
: return "G10";
1172 case E_FLAG_RL78_G13
: return "G13";
1173 case E_FLAG_RL78_G14
: return "G14";
1177 /* Merge backend specific data from an object file to the output
1178 object file when linking. */
1181 rl78_elf_merge_private_bfd_data (bfd
*ibfd
, struct bfd_link_info
*info
)
1183 bfd
*obfd
= info
->output_bfd
;
1188 new_flags
= elf_elfheader (ibfd
)->e_flags
;
1189 old_flags
= elf_elfheader (obfd
)->e_flags
;
1191 if (!elf_flags_init (obfd
))
1193 /* First call, no flags set. */
1194 elf_flags_init (obfd
) = true;
1195 elf_elfheader (obfd
)->e_flags
= new_flags
;
1197 else if (old_flags
!= new_flags
)
1199 flagword changed_flags
= old_flags
^ new_flags
;
1201 if (changed_flags
& E_FLAG_RL78_CPU_MASK
)
1203 flagword out_cpu
= old_flags
& E_FLAG_RL78_CPU_MASK
;
1204 flagword in_cpu
= new_flags
& E_FLAG_RL78_CPU_MASK
;
1206 if (in_cpu
== E_FLAG_RL78_ANY_CPU
|| in_cpu
== out_cpu
)
1207 /* It does not matter what new_cpu may have. */;
1208 else if (out_cpu
== E_FLAG_RL78_ANY_CPU
)
1210 if (in_cpu
== E_FLAG_RL78_G10
)
1212 /* G10 files can only be linked with other G10 files.
1213 If the output is set to "any" this means that it is
1214 a G14 file that does not use hardware multiply/divide,
1215 but that is still incompatible with the G10 ABI. */
1219 /* xgettext:c-format */
1220 (_("RL78 ABI conflict: G10 file %pB cannot be linked"
1221 " with %s file %pB"),
1222 ibfd
, rl78_cpu_name (out_cpu
), obfd
);
1226 old_flags
&= ~ E_FLAG_RL78_CPU_MASK
;
1227 old_flags
|= in_cpu
;
1228 elf_elfheader (obfd
)->e_flags
= old_flags
;
1236 /* xgettext:c-format */
1237 (_("RL78 ABI conflict: cannot link %s file %pB with %s file %pB"),
1238 rl78_cpu_name (in_cpu
), ibfd
,
1239 rl78_cpu_name (out_cpu
), obfd
);
1243 if (changed_flags
& E_FLAG_RL78_64BIT_DOUBLES
)
1246 (_("RL78 merge conflict: cannot link 32-bit and 64-bit objects together"));
1248 if (old_flags
& E_FLAG_RL78_64BIT_DOUBLES
)
1249 /* xgettext:c-format */
1250 _bfd_error_handler (_("- %pB is 64-bit, %pB is not"),
1253 /* xgettext:c-format */
1254 _bfd_error_handler (_("- %pB is 64-bit, %pB is not"),
1264 rl78_elf_print_private_bfd_data (bfd
* abfd
, void * ptr
)
1266 FILE * file
= (FILE *) ptr
;
1269 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
1271 /* Print normal ELF private data. */
1272 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
1274 flags
= elf_elfheader (abfd
)->e_flags
;
1275 fprintf (file
, _("private flags = 0x%lx:"), (long) flags
);
1277 if (flags
& E_FLAG_RL78_CPU_MASK
)
1278 fprintf (file
, " [%s]", rl78_cpu_name (flags
));
1280 if (flags
& E_FLAG_RL78_64BIT_DOUBLES
)
1281 fprintf (file
, _(" [64-bit doubles]"));
1287 /* Return the MACH for an e_flags value. */
1290 elf32_rl78_machine (bfd
* abfd ATTRIBUTE_UNUSED
)
1292 return bfd_mach_rl78
;
1296 rl78_elf_object_p (bfd
* abfd
)
1298 bfd_default_set_arch_mach (abfd
, bfd_arch_rl78
,
1299 elf32_rl78_machine (abfd
));
1303 /* support PLT for 16-bit references to 24-bit functions. */
1305 /* We support 16-bit pointers to code above 64k by generating a thunk
1306 below 64k containing a JMP instruction to the final address. */
1309 rl78_elf_check_relocs
1311 struct bfd_link_info
* info
,
1313 const Elf_Internal_Rela
* relocs
)
1315 Elf_Internal_Shdr
* symtab_hdr
;
1316 struct elf_link_hash_entry
** sym_hashes
;
1317 const Elf_Internal_Rela
* rel
;
1318 const Elf_Internal_Rela
* rel_end
;
1319 bfd_vma
*local_plt_offsets
;
1323 if (bfd_link_relocatable (info
))
1326 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1327 sym_hashes
= elf_sym_hashes (abfd
);
1328 local_plt_offsets
= elf_local_got_offsets (abfd
);
1329 dynobj
= elf_hash_table(info
)->dynobj
;
1331 rel_end
= relocs
+ sec
->reloc_count
;
1332 for (rel
= relocs
; rel
< rel_end
; rel
++)
1334 struct elf_link_hash_entry
*h
;
1335 unsigned long r_symndx
;
1338 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1339 if (r_symndx
< symtab_hdr
->sh_info
)
1343 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1344 while (h
->root
.type
== bfd_link_hash_indirect
1345 || h
->root
.type
== bfd_link_hash_warning
)
1346 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1349 switch (ELF32_R_TYPE (rel
->r_info
))
1351 /* This relocation describes a 16-bit pointer to a function.
1352 We may need to allocate a thunk in low memory; reserve memory
1356 elf_hash_table (info
)->dynobj
= dynobj
= abfd
;
1357 splt
= elf_hash_table (info
)->splt
;
1360 flagword flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
1361 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
1362 | SEC_READONLY
| SEC_CODE
);
1363 splt
= bfd_make_section_anyway_with_flags (dynobj
, ".plt",
1365 elf_hash_table (info
)->splt
= splt
;
1367 || !bfd_set_section_alignment (splt
, 1))
1372 offset
= &h
->plt
.offset
;
1375 if (local_plt_offsets
== NULL
)
1380 size
= symtab_hdr
->sh_info
* sizeof (bfd_vma
);
1381 local_plt_offsets
= (bfd_vma
*) bfd_alloc (abfd
, size
);
1382 if (local_plt_offsets
== NULL
)
1384 elf_local_got_offsets (abfd
) = local_plt_offsets
;
1386 for (i
= 0; i
< symtab_hdr
->sh_info
; i
++)
1387 local_plt_offsets
[i
] = (bfd_vma
) -1;
1389 offset
= &local_plt_offsets
[r_symndx
];
1392 if (*offset
== (bfd_vma
) -1)
1394 *offset
= splt
->size
;
1404 /* This must exist if dynobj is ever set. */
1407 rl78_elf_finish_dynamic_sections (bfd
*abfd ATTRIBUTE_UNUSED
,
1408 struct bfd_link_info
*info
)
1413 if (!elf_hash_table (info
)->dynamic_sections_created
)
1416 /* As an extra sanity check, verify that all plt entries have been
1417 filled in. However, relaxing might have changed the relocs so
1418 that some plt entries don't get filled in, so we have to skip
1419 this check if we're relaxing. Unfortunately, check_relocs is
1420 called before relaxation. */
1422 if (info
->relax_trip
> 0)
1425 dynobj
= elf_hash_table (info
)->dynobj
;
1426 splt
= elf_hash_table (info
)->splt
;
1427 if (dynobj
!= NULL
&& splt
!= NULL
)
1429 bfd_byte
*contents
= splt
->contents
;
1430 unsigned int i
, size
= splt
->size
;
1432 for (i
= 0; i
< size
; i
+= 4)
1434 unsigned int x
= bfd_get_32 (dynobj
, contents
+ i
);
1435 BFD_ASSERT (x
!= 0);
1443 rl78_elf_early_size_sections (bfd
*output_bfd ATTRIBUTE_UNUSED
,
1444 struct bfd_link_info
*info
)
1449 if (bfd_link_relocatable (info
))
1452 dynobj
= elf_hash_table (info
)->dynobj
;
1456 splt
= elf_hash_table (info
)->splt
;
1457 BFD_ASSERT (splt
!= NULL
);
1459 splt
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, splt
->size
);
1460 if (splt
->contents
== NULL
)
1468 /* Handle relaxing. */
1470 /* A subroutine of rl78_elf_relax_section. If the global symbol H
1471 is within the low 64k, remove any entry for it in the plt. */
1473 struct relax_plt_data
1480 rl78_relax_plt_check (struct elf_link_hash_entry
*h
, void * xdata
)
1482 struct relax_plt_data
*data
= (struct relax_plt_data
*) xdata
;
1484 if (h
->plt
.offset
!= (bfd_vma
) -1)
1488 if (h
->root
.type
== bfd_link_hash_undefined
1489 || h
->root
.type
== bfd_link_hash_undefweak
)
1492 address
= (h
->root
.u
.def
.section
->output_section
->vma
1493 + h
->root
.u
.def
.section
->output_offset
1494 + h
->root
.u
.def
.value
);
1496 if (valid_16bit_address (address
))
1499 data
->splt
->size
-= 4;
1500 *data
->again
= true;
1507 /* A subroutine of rl78_elf_relax_section. If the global symbol H
1508 previously had a plt entry, give it a new entry offset. */
1511 rl78_relax_plt_realloc (struct elf_link_hash_entry
*h
, void * xdata
)
1513 bfd_vma
*entry
= (bfd_vma
*) xdata
;
1515 if (h
->plt
.offset
!= (bfd_vma
) -1)
1517 h
->plt
.offset
= *entry
;
1525 rl78_elf_relax_plt_section (bfd
*dynobj
,
1527 struct bfd_link_info
*info
,
1530 struct relax_plt_data relax_plt_data
;
1533 /* Assume nothing changes. */
1536 if (bfd_link_relocatable (info
))
1539 /* We only relax the .plt section at the moment. */
1540 if (dynobj
!= elf_hash_table (info
)->dynobj
1541 || strcmp (splt
->name
, ".plt") != 0)
1544 /* Quick check for an empty plt. */
1545 if (splt
->size
== 0)
1548 /* Map across all global symbols; see which ones happen to
1549 fall in the low 64k. */
1550 relax_plt_data
.splt
= splt
;
1551 relax_plt_data
.again
= again
;
1552 elf_link_hash_traverse (elf_hash_table (info
), rl78_relax_plt_check
,
1555 /* Likewise for local symbols, though that's somewhat less convenient
1556 as we have to walk the list of input bfds and swap in symbol data. */
1557 for (ibfd
= info
->input_bfds
; ibfd
; ibfd
= ibfd
->link
.next
)
1559 bfd_vma
*local_plt_offsets
= elf_local_got_offsets (ibfd
);
1560 Elf_Internal_Shdr
*symtab_hdr
;
1561 Elf_Internal_Sym
*isymbuf
= NULL
;
1564 if (! local_plt_offsets
)
1567 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
1568 if (symtab_hdr
->sh_info
!= 0)
1570 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1571 if (isymbuf
== NULL
)
1572 isymbuf
= bfd_elf_get_elf_syms (ibfd
, symtab_hdr
,
1573 symtab_hdr
->sh_info
, 0,
1575 if (isymbuf
== NULL
)
1579 for (idx
= 0; idx
< symtab_hdr
->sh_info
; ++idx
)
1581 Elf_Internal_Sym
*isym
;
1585 if (local_plt_offsets
[idx
] == (bfd_vma
) -1)
1588 isym
= &isymbuf
[idx
];
1589 if (isym
->st_shndx
== SHN_UNDEF
)
1591 else if (isym
->st_shndx
== SHN_ABS
)
1592 tsec
= bfd_abs_section_ptr
;
1593 else if (isym
->st_shndx
== SHN_COMMON
)
1594 tsec
= bfd_com_section_ptr
;
1596 tsec
= bfd_section_from_elf_index (ibfd
, isym
->st_shndx
);
1598 address
= (tsec
->output_section
->vma
1599 + tsec
->output_offset
1601 if (valid_16bit_address (address
))
1603 local_plt_offsets
[idx
] = -1;
1610 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1612 if (! info
->keep_memory
)
1616 /* Cache the symbols for elf_link_input_bfd. */
1617 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1622 /* If we changed anything, walk the symbols again to reallocate
1623 .plt entry addresses. */
1624 if (*again
&& splt
->size
> 0)
1628 elf_link_hash_traverse (elf_hash_table (info
),
1629 rl78_relax_plt_realloc
, &entry
);
1631 for (ibfd
= info
->input_bfds
; ibfd
; ibfd
= ibfd
->link
.next
)
1633 bfd_vma
*local_plt_offsets
= elf_local_got_offsets (ibfd
);
1634 unsigned int nlocals
= elf_tdata (ibfd
)->symtab_hdr
.sh_info
;
1637 if (! local_plt_offsets
)
1640 for (idx
= 0; idx
< nlocals
; ++idx
)
1641 if (local_plt_offsets
[idx
] != (bfd_vma
) -1)
1643 local_plt_offsets
[idx
] = entry
;
1652 /* Delete some bytes from a section while relaxing. */
1655 elf32_rl78_relax_delete_bytes (bfd
*abfd
, asection
*sec
, bfd_vma addr
, int count
,
1656 Elf_Internal_Rela
*alignment_rel
, int force_snip
)
1658 Elf_Internal_Shdr
* symtab_hdr
;
1659 unsigned int sec_shndx
;
1660 bfd_byte
* contents
;
1661 Elf_Internal_Rela
* irel
;
1662 Elf_Internal_Rela
* irelend
;
1663 Elf_Internal_Sym
* isym
;
1664 Elf_Internal_Sym
* isymend
;
1666 unsigned int symcount
;
1667 struct elf_link_hash_entry
** sym_hashes
;
1668 struct elf_link_hash_entry
** end_hashes
;
1673 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1675 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1677 /* The deletion must stop at the next alignment boundary, if
1678 ALIGNMENT_REL is non-NULL. */
1681 toaddr
= alignment_rel
->r_offset
;
1683 irel
= elf_section_data (sec
)->relocs
;
1686 _bfd_elf_link_read_relocs (sec
->owner
, sec
, NULL
, NULL
, true);
1687 irel
= elf_section_data (sec
)->relocs
;
1690 irelend
= irel
+ sec
->reloc_count
;
1692 /* Actually delete the bytes. */
1693 memmove (contents
+ addr
, contents
+ addr
+ count
,
1694 (size_t) (toaddr
- addr
- count
));
1696 /* If we don't have an alignment marker to worry about, we can just
1697 shrink the section. Otherwise, we have to fill in the newly
1698 created gap with NOP insns (0x03). */
1702 memset (contents
+ toaddr
- count
, 0x03, count
);
1704 /* Adjust all the relocs. */
1705 for (; irel
&& irel
< irelend
; irel
++)
1707 /* Get the new reloc address. */
1708 if (irel
->r_offset
> addr
1709 && (irel
->r_offset
< toaddr
1710 || (force_snip
&& irel
->r_offset
== toaddr
)))
1711 irel
->r_offset
-= count
;
1713 /* If we see an ALIGN marker at the end of the gap, we move it
1714 to the beginning of the gap, since marking these gaps is what
1716 if (irel
->r_offset
== toaddr
1717 && ELF32_R_TYPE (irel
->r_info
) == R_RL78_RH_RELAX
1718 && irel
->r_addend
& RL78_RELAXA_ALIGN
)
1719 irel
->r_offset
-= count
;
1722 /* Adjust the local symbols defined in this section. */
1723 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1724 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1725 isymend
= isym
+ symtab_hdr
->sh_info
;
1727 for (; isym
< isymend
; isym
++)
1729 /* If the symbol is in the range of memory we just moved, we
1730 have to adjust its value. */
1731 if (isym
->st_shndx
== sec_shndx
1732 && isym
->st_value
> addr
1733 && isym
->st_value
< toaddr
)
1734 isym
->st_value
-= count
;
1736 /* If the symbol *spans* the bytes we just deleted (i.e. it's
1737 *end* is in the moved bytes but it's *start* isn't), then we
1738 must adjust its size. */
1739 if (isym
->st_shndx
== sec_shndx
1740 && isym
->st_value
< addr
1741 && isym
->st_value
+ isym
->st_size
> addr
1742 && isym
->st_value
+ isym
->st_size
< toaddr
)
1743 isym
->st_size
-= count
;
1746 /* Now adjust the global symbols defined in this section. */
1747 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1748 - symtab_hdr
->sh_info
);
1749 sym_hashes
= elf_sym_hashes (abfd
);
1750 end_hashes
= sym_hashes
+ symcount
;
1752 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1754 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1756 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1757 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1758 && sym_hash
->root
.u
.def
.section
== sec
)
1760 /* As above, adjust the value if needed. */
1761 if (sym_hash
->root
.u
.def
.value
> addr
1762 && sym_hash
->root
.u
.def
.value
< toaddr
)
1763 sym_hash
->root
.u
.def
.value
-= count
;
1765 /* As above, adjust the size if needed. */
1766 if (sym_hash
->root
.u
.def
.value
< addr
1767 && sym_hash
->root
.u
.def
.value
+ sym_hash
->size
> addr
1768 && sym_hash
->root
.u
.def
.value
+ sym_hash
->size
< toaddr
)
1769 sym_hash
->size
-= count
;
1776 /* Used to sort relocs by address. If relocs have the same address,
1777 we maintain their relative order, except that R_RL78_RH_RELAX
1778 alignment relocs must be the first reloc for any given address. */
1781 reloc_bubblesort (Elf_Internal_Rela
* r
, int count
)
1787 /* This is almost a classic bubblesort. It's the slowest sort, but
1788 we're taking advantage of the fact that the relocations are
1789 mostly in order already (the assembler emits them that way) and
1790 we need relocs with the same address to remain in the same
1796 for (i
= 0; i
< count
- 1; i
++)
1798 if (r
[i
].r_offset
> r
[i
+ 1].r_offset
)
1800 else if (r
[i
].r_offset
< r
[i
+ 1].r_offset
)
1802 else if (ELF32_R_TYPE (r
[i
+ 1].r_info
) == R_RL78_RH_RELAX
1803 && (r
[i
+ 1].r_addend
& RL78_RELAXA_ALIGN
))
1805 else if (ELF32_R_TYPE (r
[i
+ 1].r_info
) == R_RL78_RH_RELAX
1806 && (r
[i
+ 1].r_addend
& RL78_RELAXA_ELIGN
)
1807 && !(ELF32_R_TYPE (r
[i
].r_info
) == R_RL78_RH_RELAX
1808 && (r
[i
].r_addend
& RL78_RELAXA_ALIGN
)))
1815 Elf_Internal_Rela tmp
;
1820 /* If we do move a reloc back, re-scan to see if it
1821 needs to be moved even further back. This avoids
1822 most of the O(n^2) behavior for our cases. */
1832 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
1833 rl78_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1834 lrel, abfd, sec, link_info, scale)
1837 rl78_offset_for_reloc (bfd
* abfd
,
1838 Elf_Internal_Rela
* rel
,
1839 Elf_Internal_Shdr
* symtab_hdr
,
1840 bfd_byte
* shndx_buf ATTRIBUTE_UNUSED
,
1841 Elf_Internal_Sym
* intsyms
,
1842 Elf_Internal_Rela
** lrel
,
1844 asection
* input_section
,
1845 struct bfd_link_info
* info
,
1852 /* REL is the first of 1..N relocations. We compute the symbol
1853 value for each relocation, then combine them if needed. LREL
1854 gets a pointer to the last relocation used. */
1857 unsigned long r_type
;
1859 /* Get the value of the symbol referred to by the reloc. */
1860 if (ELF32_R_SYM (rel
->r_info
) < symtab_hdr
->sh_info
)
1862 /* A local symbol. */
1863 Elf_Internal_Sym
*isym
;
1866 isym
= intsyms
+ ELF32_R_SYM (rel
->r_info
);
1868 if (isym
->st_shndx
== SHN_UNDEF
)
1869 ssec
= bfd_und_section_ptr
;
1870 else if (isym
->st_shndx
== SHN_ABS
)
1871 ssec
= bfd_abs_section_ptr
;
1872 else if (isym
->st_shndx
== SHN_COMMON
)
1873 ssec
= bfd_com_section_ptr
;
1875 ssec
= bfd_section_from_elf_index (abfd
,
1878 /* Initial symbol value. */
1879 symval
= isym
->st_value
;
1881 /* GAS may have made this symbol relative to a section, in
1882 which case, we have to add the addend to find the
1884 if (ELF_ST_TYPE (isym
->st_info
) == STT_SECTION
)
1885 symval
+= rel
->r_addend
;
1889 if ((ssec
->flags
& SEC_MERGE
)
1890 && ssec
->sec_info_type
== SEC_INFO_TYPE_MERGE
)
1891 symval
= _bfd_merged_section_offset (abfd
, & ssec
,
1892 elf_section_data (ssec
)->sec_info
,
1896 /* Now make the offset relative to where the linker is putting it. */
1899 ssec
->output_section
->vma
+ ssec
->output_offset
;
1901 symval
+= rel
->r_addend
;
1906 struct elf_link_hash_entry
* h
;
1908 /* An external symbol. */
1909 indx
= ELF32_R_SYM (rel
->r_info
) - symtab_hdr
->sh_info
;
1910 h
= elf_sym_hashes (abfd
)[indx
];
1911 BFD_ASSERT (h
!= NULL
);
1913 if (h
->root
.type
!= bfd_link_hash_defined
1914 && h
->root
.type
!= bfd_link_hash_defweak
)
1916 /* This appears to be a reference to an undefined
1917 symbol. Just ignore it--it will be caught by the
1918 regular reloc processing. */
1924 symval
= (h
->root
.u
.def
.value
1925 + h
->root
.u
.def
.section
->output_section
->vma
1926 + h
->root
.u
.def
.section
->output_offset
);
1928 symval
+= rel
->r_addend
;
1931 r_type
= ELF32_R_TYPE (rel
->r_info
);
1935 (void) rl78_compute_complex_reloc (r_type
, symval
, input_section
,
1939 case R_RL78_OPromtop
:
1940 symval
= get_romstart (info
, input_bfd
, input_section
, rel
->r_offset
);
1941 (void) rl78_compute_complex_reloc (r_type
, symval
, input_section
,
1945 case R_RL78_OPramtop
:
1946 symval
= get_ramstart (info
, input_bfd
, input_section
, rel
->r_offset
);
1947 (void) rl78_compute_complex_reloc (r_type
, symval
, input_section
,
1958 case R_RL78_OPsctsize
:
1959 case R_RL78_OPscttop
:
1965 (void) rl78_compute_complex_reloc (r_type
, 0, input_section
,
1969 case R_RL78_DIR16UL
:
1971 case R_RL78_ABS16UL
:
1974 goto reloc_computes_value
;
1976 case R_RL78_DIR16UW
:
1978 case R_RL78_ABS16UW
:
1981 goto reloc_computes_value
;
1984 reloc_computes_value
:
1985 symval
= rl78_compute_complex_reloc (r_type
, symval
, input_section
,
1993 case R_RL78_DIR24S_PCREL
:
1994 case R_RL78_DIR16S_PCREL
:
1995 case R_RL78_DIR8S_PCREL
:
2006 int prefix
; /* or -1 for "no prefix" */
2007 int insn
; /* or -1 for "end of list" */
2008 int insn_for_saddr
; /* or -1 for "no alternative" */
2009 int insn_for_sfr
; /* or -1 for "no alternative" */
2010 } relax_addr16
[] = {
2011 { -1, 0x02, 0x06, -1 }, /* ADDW AX, !addr16 */
2012 { -1, 0x22, 0x26, -1 }, /* SUBW AX, !addr16 */
2013 { -1, 0x42, 0x46, -1 }, /* CMPW AX, !addr16 */
2014 { -1, 0x40, 0x4a, -1 }, /* CMP !addr16, #byte */
2016 { -1, 0x0f, 0x0b, -1 }, /* ADD A, !addr16 */
2017 { -1, 0x1f, 0x1b, -1 }, /* ADDC A, !addr16 */
2018 { -1, 0x2f, 0x2b, -1 }, /* SUB A, !addr16 */
2019 { -1, 0x3f, 0x3b, -1 }, /* SUBC A, !addr16 */
2020 { -1, 0x4f, 0x4b, -1 }, /* CMP A, !addr16 */
2021 { -1, 0x5f, 0x5b, -1 }, /* AND A, !addr16 */
2022 { -1, 0x6f, 0x6b, -1 }, /* OR A, !addr16 */
2023 { -1, 0x7f, 0x7b, -1 }, /* XOR A, !addr16 */
2025 { -1, 0x8f, 0x8d, 0x8e }, /* MOV A, !addr16 */
2026 { -1, 0x9f, 0x9d, 0x9e }, /* MOV !addr16, A */
2027 { -1, 0xaf, 0xad, 0xae }, /* MOVW AX, !addr16 */
2028 { -1, 0xbf, 0xbd, 0xbe }, /* MOVW !addr16, AX */
2029 { -1, 0xcf, 0xcd, 0xce }, /* MOVW !addr16, #word */
2031 { -1, 0xa0, 0xa4, -1 }, /* INC !addr16 */
2032 { -1, 0xa2, 0xa6, -1 }, /* INCW !addr16 */
2033 { -1, 0xb0, 0xb4, -1 }, /* DEC !addr16 */
2034 { -1, 0xb2, 0xb6, -1 }, /* DECW !addr16 */
2036 { -1, 0xd5, 0xd4, -1 }, /* CMP0 !addr16 */
2037 { -1, 0xe5, 0xe4, -1 }, /* ONEB !addr16 */
2038 { -1, 0xf5, 0xf4, -1 }, /* CLRB !addr16 */
2040 { -1, 0xd9, 0xd8, -1 }, /* MOV X, !addr16 */
2041 { -1, 0xe9, 0xe8, -1 }, /* MOV B, !addr16 */
2042 { -1, 0xf9, 0xf8, -1 }, /* MOV C, !addr16 */
2043 { -1, 0xdb, 0xda, -1 }, /* MOVW BC, !addr16 */
2044 { -1, 0xeb, 0xea, -1 }, /* MOVW DE, !addr16 */
2045 { -1, 0xfb, 0xfa, -1 }, /* MOVW HL, !addr16 */
2047 { 0x61, 0xaa, 0xa8, -1 }, /* XCH A, !addr16 */
2049 { 0x71, 0x00, 0x02, 0x0a }, /* SET1 !addr16.0 */
2050 { 0x71, 0x10, 0x12, 0x1a }, /* SET1 !addr16.0 */
2051 { 0x71, 0x20, 0x22, 0x2a }, /* SET1 !addr16.0 */
2052 { 0x71, 0x30, 0x32, 0x3a }, /* SET1 !addr16.0 */
2053 { 0x71, 0x40, 0x42, 0x4a }, /* SET1 !addr16.0 */
2054 { 0x71, 0x50, 0x52, 0x5a }, /* SET1 !addr16.0 */
2055 { 0x71, 0x60, 0x62, 0x6a }, /* SET1 !addr16.0 */
2056 { 0x71, 0x70, 0x72, 0x7a }, /* SET1 !addr16.0 */
2058 { 0x71, 0x08, 0x03, 0x0b }, /* CLR1 !addr16.0 */
2059 { 0x71, 0x18, 0x13, 0x1b }, /* CLR1 !addr16.0 */
2060 { 0x71, 0x28, 0x23, 0x2b }, /* CLR1 !addr16.0 */
2061 { 0x71, 0x38, 0x33, 0x3b }, /* CLR1 !addr16.0 */
2062 { 0x71, 0x48, 0x43, 0x4b }, /* CLR1 !addr16.0 */
2063 { 0x71, 0x58, 0x53, 0x5b }, /* CLR1 !addr16.0 */
2064 { 0x71, 0x68, 0x63, 0x6b }, /* CLR1 !addr16.0 */
2065 { 0x71, 0x78, 0x73, 0x7b }, /* CLR1 !addr16.0 */
2070 /* Relax one section. */
2073 rl78_elf_relax_section (bfd
*abfd
,
2075 struct bfd_link_info
*link_info
,
2078 Elf_Internal_Shdr
* symtab_hdr
;
2079 Elf_Internal_Shdr
* shndx_hdr
;
2080 Elf_Internal_Rela
* internal_relocs
;
2081 Elf_Internal_Rela
* free_relocs
= NULL
;
2082 Elf_Internal_Rela
* irel
;
2083 Elf_Internal_Rela
* srel
;
2084 Elf_Internal_Rela
* irelend
;
2085 Elf_Internal_Rela
* next_alignment
;
2086 bfd_byte
* contents
= NULL
;
2087 bfd_byte
* free_contents
= NULL
;
2088 Elf_Internal_Sym
* intsyms
= NULL
;
2089 Elf_Internal_Sym
* free_intsyms
= NULL
;
2090 bfd_byte
* shndx_buf
= NULL
;
2092 bfd_vma symval ATTRIBUTE_UNUSED
= 0;
2093 int pcrel ATTRIBUTE_UNUSED
= 0;
2094 int code ATTRIBUTE_UNUSED
= 0;
2095 int section_alignment_glue
;
2098 if (abfd
== elf_hash_table (link_info
)->dynobj
2099 && strcmp (sec
->name
, ".plt") == 0)
2100 return rl78_elf_relax_plt_section (abfd
, sec
, link_info
, again
);
2102 /* Assume nothing changes. */
2105 /* We don't have to do anything for a relocatable link, if
2106 this section does not have relocs, or if this is not a
2108 if (bfd_link_relocatable (link_info
)
2109 || sec
->reloc_count
== 0
2110 || (sec
->flags
& SEC_RELOC
) == 0
2111 || (sec
->flags
& SEC_HAS_CONTENTS
) == 0
2112 || (sec
->flags
& SEC_CODE
) == 0)
2115 symtab_hdr
= & elf_symtab_hdr (abfd
);
2116 if (elf_symtab_shndx_list (abfd
))
2117 shndx_hdr
= & elf_symtab_shndx_list (abfd
)->hdr
;
2121 /* Get the section contents. */
2122 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
2123 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2124 /* Go get them off disk. */
2127 if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
2129 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2132 /* Read this BFD's symbols. */
2133 /* Get cached copy if it exists. */
2134 if (symtab_hdr
->contents
!= NULL
)
2135 intsyms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2138 intsyms
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
, symtab_hdr
->sh_info
, 0, NULL
, NULL
, NULL
);
2139 symtab_hdr
->contents
= (bfd_byte
*) intsyms
;
2142 if (shndx_hdr
&& shndx_hdr
->sh_size
!= 0)
2146 if (_bfd_mul_overflow (symtab_hdr
->sh_info
,
2147 sizeof (Elf_External_Sym_Shndx
), &amt
))
2149 bfd_set_error (bfd_error_no_memory
);
2152 if (bfd_seek (abfd
, shndx_hdr
->sh_offset
, SEEK_SET
) != 0)
2154 shndx_buf
= _bfd_malloc_and_read (abfd
, amt
, amt
);
2155 if (shndx_buf
== NULL
)
2157 shndx_hdr
->contents
= shndx_buf
;
2160 /* Get a copy of the native relocations. */
2161 internal_relocs
= (_bfd_elf_link_read_relocs
2162 (abfd
, sec
, NULL
, (Elf_Internal_Rela
*) NULL
,
2163 link_info
->keep_memory
));
2164 if (internal_relocs
== NULL
)
2166 if (! link_info
->keep_memory
)
2167 free_relocs
= internal_relocs
;
2169 /* The RL_ relocs must be just before the operand relocs they go
2170 with, so we must sort them to guarantee this. We use bubblesort
2171 instead of qsort so we can guarantee that relocs with the same
2172 address remain in the same relative order. */
2173 reloc_bubblesort (internal_relocs
, sec
->reloc_count
);
2175 /* Walk through them looking for relaxing opportunities. */
2176 irelend
= internal_relocs
+ sec
->reloc_count
;
2179 /* This will either be NULL or a pointer to the next alignment
2181 next_alignment
= internal_relocs
;
2183 /* We calculate worst case shrinkage caused by alignment directives.
2184 No fool-proof, but better than either ignoring the problem or
2185 doing heavy duty analysis of all the alignment markers in all
2187 section_alignment_glue
= 0;
2188 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2189 if (ELF32_R_TYPE (irel
->r_info
) == R_RL78_RH_RELAX
2190 && irel
->r_addend
& RL78_RELAXA_ALIGN
)
2192 int this_glue
= 1 << (irel
->r_addend
& RL78_RELAXA_ANUM
);
2194 if (section_alignment_glue
< this_glue
)
2195 section_alignment_glue
= this_glue
;
2197 /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
2199 section_alignment_glue
*= 2;
2201 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2203 unsigned char *insn
;
2206 /* The insns we care about are all marked with one of these. */
2207 if (ELF32_R_TYPE (irel
->r_info
) != R_RL78_RH_RELAX
)
2210 if (irel
->r_addend
& RL78_RELAXA_ALIGN
2211 || next_alignment
== internal_relocs
)
2213 /* When we delete bytes, we need to maintain all the alignments
2214 indicated. In addition, we need to be careful about relaxing
2215 jumps across alignment boundaries - these displacements
2216 *grow* when we delete bytes. For now, don't shrink
2217 displacements across an alignment boundary, just in case.
2218 Note that this only affects relocations to the same
2220 next_alignment
+= 2;
2221 while (next_alignment
< irelend
2222 && (ELF32_R_TYPE (next_alignment
->r_info
) != R_RL78_RH_RELAX
2223 || !(next_alignment
->r_addend
& RL78_RELAXA_ELIGN
)))
2225 if (next_alignment
>= irelend
|| next_alignment
->r_offset
== 0)
2226 next_alignment
= NULL
;
2229 /* When we hit alignment markers, see if we've shrunk enough
2230 before them to reduce the gap without violating the alignment
2232 if (irel
->r_addend
& RL78_RELAXA_ALIGN
)
2234 /* At this point, the next relocation *should* be the ELIGN
2236 Elf_Internal_Rela
*erel
= irel
+ 1;
2237 unsigned int alignment
, nbytes
;
2239 if (ELF32_R_TYPE (erel
->r_info
) != R_RL78_RH_RELAX
)
2241 if (!(erel
->r_addend
& RL78_RELAXA_ELIGN
))
2244 alignment
= 1 << (irel
->r_addend
& RL78_RELAXA_ANUM
);
2246 if (erel
->r_offset
- irel
->r_offset
< alignment
)
2249 nbytes
= erel
->r_offset
- irel
->r_offset
;
2250 nbytes
/= alignment
;
2251 nbytes
*= alignment
;
2253 elf32_rl78_relax_delete_bytes (abfd
, sec
, erel
->r_offset
- nbytes
, nbytes
,
2254 next_alignment
, erel
->r_offset
== sec
->size
);
2260 if (irel
->r_addend
& RL78_RELAXA_ELIGN
)
2263 insn
= contents
+ irel
->r_offset
;
2265 nrelocs
= irel
->r_addend
& RL78_RELAXA_RNUM
;
2267 /* At this point, we have an insn that is a candidate for linker
2268 relaxation. There are NRELOCS relocs following that may be
2269 relaxed, although each reloc may be made of more than one
2270 reloc entry (such as gp-rel symbols). */
2272 /* Get the value of the symbol referred to by the reloc. Just
2273 in case this is the last reloc in the list, use the RL's
2274 addend to choose between this reloc (no addend) or the next
2275 (yes addend, which means at least one following reloc). */
2277 /* srel points to the "current" reloction for this insn -
2278 actually the last reloc for a given operand, which is the one
2279 we need to update. We check the relaxations in the same
2280 order that the relocations happen, so we'll just push it
2284 pc
= sec
->output_section
->vma
+ sec
->output_offset
2288 BFD_ASSERT (nrelocs > 0); \
2289 symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \
2290 pcrel = symval - pc + srel->r_addend; \
2293 #define SNIPNR(offset, nbytes) \
2294 elf32_rl78_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0);
2296 #define SNIP(offset, nbytes, newtype) \
2297 SNIPNR (offset, nbytes); \
2298 srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2300 /* The order of these bit tests must match the order that the
2301 relocs appear in. Since we sorted those by offset, we can
2304 /*----------------------------------------------------------------------*/
2305 /* EF ad BR $rel8 pcrel
2306 ED al ah BR !abs16 abs
2307 EE al ah BR $!rel16 pcrel
2308 EC al ah as BR !!abs20 abs
2310 FD al ah CALL !abs16 abs
2311 FE al ah CALL $!rel16 pcrel
2312 FC al ah as CALL !!abs20 abs
2320 61 C8 EF ad SKC ; BR $rel8
2321 61 D8 EF ad SKNC ; BR $rel8
2322 61 E8 EF ad SKZ ; BR $rel8
2323 61 F8 EF ad SKNZ ; BR $rel8
2324 61 E3 EF ad SKH ; BR $rel8
2325 61 F3 EF ad SKNH ; BR $rel8
2328 if ((irel
->r_addend
& RL78_RELAXA_MASK
) == RL78_RELAXA_BRA
)
2330 /* SKIP opcodes that skip non-branches will have a relax tag
2331 but no corresponding symbol to relax against; we just
2333 if (irel
->r_addend
& RL78_RELAXA_RNUM
)
2342 case 0xde: /* BNC */
2343 case 0xdf: /* BNZ */
2344 if (insn
[1] == 0x03 && insn
[2] == 0xee /* BR */
2345 && (srel
->r_offset
- irel
->r_offset
) > 1) /* a B<c> without its own reloc */
2347 /* This is a "long" conditional as generated by gas:
2352 insn
[0] ^= 0x02; /* invert conditional */
2354 SNIP (1, 2, R_RL78_DIR8S_PCREL
);
2361 case 0xec: /* BR !!abs20 */
2368 SNIP (2, 2, R_RL78_DIR8S_PCREL
);
2371 else if (symval
< 65536)
2374 insn
[1] = symval
& 0xff;
2375 insn
[2] = symval
>> 8;
2376 SNIP (2, 1, R_RL78_DIR16U
);
2379 else if (pcrel
< 32767
2383 insn
[1] = pcrel
& 0xff;
2384 insn
[2] = pcrel
>> 8;
2385 SNIP (2, 1, R_RL78_DIR16S_PCREL
);
2390 case 0xee: /* BR $!pcrel16 */
2391 case 0xed: /* BR $!abs16 */
2397 SNIP (2, 1, R_RL78_DIR8S_PCREL
);
2402 case 0xfc: /* CALL !!abs20 */
2406 insn
[1] = symval
& 0xff;
2407 insn
[2] = symval
>> 8;
2408 SNIP (2, 1, R_RL78_DIR16U
);
2411 else if (pcrel
< 32767
2415 insn
[1] = pcrel
& 0xff;
2416 insn
[2] = pcrel
>> 8;
2417 SNIP (2, 1, R_RL78_DIR16S_PCREL
);
2422 case 0x61: /* PREFIX */
2423 /* For SKIP/BR, we change the BR opcode and delete the
2424 SKIP. That way, we don't have to find and change the
2425 relocation for the BR. */
2426 /* Note that, for the case where we're skipping some
2427 other insn, we have no "other" reloc but that's safe
2431 case 0xd3: /* BNH */
2433 if (insn
[2] == 0x03 && insn
[3] == 0xee
2434 && (srel
->r_offset
- irel
->r_offset
) > 2) /* a B<c> without its own reloc */
2436 /* Another long branch by gas:
2437 61 D3 03 EE ad.dr */
2441 insn
[1] ^= 0x10; /* invert conditional */
2443 SNIP (2, 2, R_RL78_DIR8S_PCREL
);
2450 case 0xc8: /* SKC */
2451 if (insn
[2] == 0xef)
2453 insn
[2] = 0xde; /* BNC */
2458 case 0xd8: /* SKNC */
2459 if (insn
[2] == 0xef)
2461 insn
[2] = 0xdc; /* BC */
2466 case 0xe8: /* SKZ */
2467 if (insn
[2] == 0xef)
2469 insn
[2] = 0xdf; /* BNZ */
2474 case 0xf8: /* SKNZ */
2475 if (insn
[2] == 0xef)
2477 insn
[2] = 0xdd; /* BZ */
2482 case 0xe3: /* SKH */
2483 if (insn
[2] == 0xef)
2485 insn
[2] = 0xd3; /* BNH */
2486 SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2490 case 0xf3: /* SKNH */
2491 if (insn
[2] == 0xef)
2493 insn
[2] = 0xc3; /* BH */
2494 SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2502 if ((irel
->r_addend
& RL78_RELAXA_MASK
) == RL78_RELAXA_ADDR16
2505 /*----------------------------------------------------------------------*/
2506 /* Some insns have both a 16-bit address operand and an 8-bit
2507 variant if the address is within a special range:
2509 Address 16-bit operand SADDR range SFR range
2510 FFF00-FFFFF 0xff00-0xffff 0x00-0xff
2511 FFE20-FFF1F 0xfe20-0xff1f 0x00-0xff
2513 The RELAX_ADDR16[] array has the insn encodings for the
2514 16-bit operand version, as well as the SFR and SADDR
2515 variants. We only need to replace the encodings and
2518 Note: we intentionally do not attempt to decode and skip
2519 any ES: prefix, as adding ES: means the addr16 (likely)
2520 no longer points to saddr/sfr space.
2530 if (0xffe20 <= symval
&& symval
<= 0xfffff)
2533 is_saddr
= (0xffe20 <= symval
&& symval
<= 0xfff1f);
2534 is_sfr
= (0xfff00 <= symval
&& symval
<= 0xfffff);
2536 for (idx
= 0; relax_addr16
[idx
].insn
!= -1; idx
++)
2538 if (relax_addr16
[idx
].prefix
!= -1
2539 && insn
[0] == relax_addr16
[idx
].prefix
2540 && insn
[1] == relax_addr16
[idx
].insn
)
2544 else if (relax_addr16
[idx
].prefix
== -1
2545 && insn
[0] == relax_addr16
[idx
].insn
)
2552 /* We have a matched insn, and poff is 0 or 1 depending
2553 on the base pattern size. */
2555 if (is_sfr
&& relax_addr16
[idx
].insn_for_sfr
!= -1)
2557 insn
[poff
] = relax_addr16
[idx
].insn_for_sfr
;
2558 SNIP (poff
+2, 1, R_RL78_RH_SFR
);
2561 else if (is_saddr
&& relax_addr16
[idx
].insn_for_saddr
!= -1)
2563 insn
[poff
] = relax_addr16
[idx
].insn_for_saddr
;
2564 SNIP (poff
+2, 1, R_RL78_RH_SADDR
);
2569 /*----------------------------------------------------------------------*/
2576 free (free_contents
);
2578 if (shndx_buf
!= NULL
)
2580 shndx_hdr
->contents
= NULL
;
2584 free (free_intsyms
);
2591 #define ELF_ARCH bfd_arch_rl78
2592 #define ELF_MACHINE_CODE EM_RL78
2593 #define ELF_MAXPAGESIZE 0x1000
2595 #define TARGET_LITTLE_SYM rl78_elf32_vec
2596 #define TARGET_LITTLE_NAME "elf32-rl78"
2598 #define elf_info_to_howto_rel NULL
2599 #define elf_info_to_howto rl78_info_to_howto_rela
2600 #define elf_backend_object_p rl78_elf_object_p
2601 #define elf_backend_relocate_section rl78_elf_relocate_section
2602 #define elf_symbol_leading_char ('_')
2603 #define elf_backend_can_gc_sections 1
2605 #define bfd_elf32_bfd_reloc_type_lookup rl78_reloc_type_lookup
2606 #define bfd_elf32_bfd_reloc_name_lookup rl78_reloc_name_lookup
2607 #define bfd_elf32_bfd_set_private_flags rl78_elf_set_private_flags
2608 #define bfd_elf32_bfd_merge_private_bfd_data rl78_elf_merge_private_bfd_data
2609 #define bfd_elf32_bfd_print_private_bfd_data rl78_elf_print_private_bfd_data
2611 #define bfd_elf32_bfd_relax_section rl78_elf_relax_section
2612 #define elf_backend_check_relocs rl78_elf_check_relocs
2613 #define elf_backend_early_size_sections \
2614 rl78_elf_early_size_sections
2615 #define elf_backend_finish_dynamic_sections \
2616 rl78_elf_finish_dynamic_sections
2618 #include "elf32-target.h"