Home | History | Annotate | Line # | Download | only in bfd
elf32-h8300.c revision 1.1.1.9.2.1
      1          1.1     skrll /* BFD back-end for Renesas H8/300 ELF binaries.
      2  1.1.1.9.2.1  perseant    Copyright (C) 1993-2024 Free Software Foundation, Inc.
      3          1.1     skrll 
      4          1.1     skrll    This file is part of BFD, the Binary File Descriptor library.
      5          1.1     skrll 
      6          1.1     skrll    This program is free software; you can redistribute it and/or modify
      7          1.1     skrll    it under the terms of the GNU General Public License as published by
      8          1.1     skrll    the Free Software Foundation; either version 3 of the License, or
      9          1.1     skrll    (at your option) any later version.
     10          1.1     skrll 
     11          1.1     skrll    This program is distributed in the hope that it will be useful,
     12          1.1     skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13          1.1     skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14          1.1     skrll    GNU General Public License for more details.
     15          1.1     skrll 
     16          1.1     skrll    You should have received a copy of the GNU General Public License
     17          1.1     skrll    along with this program; if not, write to the Free Software
     18          1.1     skrll    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19          1.1     skrll    MA 02110-1301, USA.  */
     20          1.1     skrll 
     21          1.1     skrll #include "sysdep.h"
     22          1.1     skrll #include "bfd.h"
     23          1.1     skrll #include "libbfd.h"
     24          1.1     skrll #include "elf-bfd.h"
     25          1.1     skrll #include "elf/h8.h"
     26      1.1.1.8  christos #include "cpu-h8300.h"
     27          1.1     skrll 
     28          1.1     skrll static reloc_howto_type *elf32_h8_reloc_type_lookup
     29          1.1     skrll   (bfd *abfd, bfd_reloc_code_real_type code);
     30      1.1.1.9  christos static bool elf32_h8_info_to_howto
     31          1.1     skrll   (bfd *, arelent *, Elf_Internal_Rela *);
     32      1.1.1.9  christos static bool elf32_h8_info_to_howto_rel
     33          1.1     skrll   (bfd *, arelent *, Elf_Internal_Rela *);
     34          1.1     skrll static unsigned long elf32_h8_mach (flagword);
     35      1.1.1.9  christos static bool elf32_h8_object_p (bfd *);
     36      1.1.1.9  christos static bool elf32_h8_merge_private_bfd_data
     37      1.1.1.6  christos   (bfd *, struct bfd_link_info *);
     38      1.1.1.9  christos static bool elf32_h8_relax_section
     39      1.1.1.9  christos   (bfd *, asection *, struct bfd_link_info *, bool *);
     40      1.1.1.9  christos static bool elf32_h8_relax_delete_bytes
     41          1.1     skrll   (bfd *, asection *, bfd_vma, int);
     42      1.1.1.9  christos static bool elf32_h8_symbol_address_p (bfd *, asection *, bfd_vma);
     43          1.1     skrll static bfd_byte *elf32_h8_get_relocated_section_contents
     44          1.1     skrll   (bfd *, struct bfd_link_info *, struct bfd_link_order *,
     45      1.1.1.9  christos    bfd_byte *, bool, asymbol **);
     46          1.1     skrll static bfd_reloc_status_type elf32_h8_final_link_relocate
     47          1.1     skrll   (unsigned long, bfd *, bfd *, asection *,
     48          1.1     skrll    bfd_byte *, bfd_vma, bfd_vma, bfd_vma,
     49          1.1     skrll    struct bfd_link_info *, asection *, int);
     50      1.1.1.9  christos static int elf32_h8_relocate_section
     51          1.1     skrll   (bfd *, struct bfd_link_info *, bfd *, asection *,
     52          1.1     skrll    bfd_byte *, Elf_Internal_Rela *,
     53          1.1     skrll    Elf_Internal_Sym *, asection **);
     54          1.1     skrll static bfd_reloc_status_type special
     55      1.1.1.3  christos   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     56          1.1     skrll 
     57          1.1     skrll /* This does not include any relocation information, but should be
     58          1.1     skrll    good enough for GDB or objdump to read the file.  */
     59          1.1     skrll 
     60      1.1.1.3  christos static reloc_howto_type h8_elf_howto_table[] =
     61      1.1.1.3  christos {
     62          1.1     skrll #define R_H8_NONE_X 0
     63          1.1     skrll   HOWTO (R_H8_NONE,		/* type */
     64          1.1     skrll 	 0,			/* rightshift */
     65      1.1.1.9  christos 	 0,			/* size */
     66          1.1     skrll 	 0,			/* bitsize */
     67      1.1.1.9  christos 	 false,			/* pc_relative */
     68          1.1     skrll 	 0,			/* bitpos */
     69          1.1     skrll 	 complain_overflow_dont,/* complain_on_overflow */
     70          1.1     skrll 	 special,		/* special_function */
     71          1.1     skrll 	 "R_H8_NONE",		/* name */
     72      1.1.1.9  christos 	 false,			/* partial_inplace */
     73          1.1     skrll 	 0,			/* src_mask */
     74          1.1     skrll 	 0,			/* dst_mask */
     75      1.1.1.9  christos 	 false),		/* pcrel_offset */
     76          1.1     skrll #define R_H8_DIR32_X (R_H8_NONE_X + 1)
     77          1.1     skrll   HOWTO (R_H8_DIR32,		/* type */
     78          1.1     skrll 	 0,			/* rightshift */
     79      1.1.1.9  christos 	 4,			/* size */
     80          1.1     skrll 	 32,			/* bitsize */
     81      1.1.1.9  christos 	 false,			/* pc_relative */
     82          1.1     skrll 	 0,			/* bitpos */
     83          1.1     skrll 	 complain_overflow_dont,/* complain_on_overflow */
     84          1.1     skrll 	 special,		/* special_function */
     85          1.1     skrll 	 "R_H8_DIR32",		/* name */
     86      1.1.1.9  christos 	 false,			/* partial_inplace */
     87          1.1     skrll 	 0,			/* src_mask */
     88          1.1     skrll 	 0xffffffff,		/* dst_mask */
     89      1.1.1.9  christos 	 false),		/* pcrel_offset */
     90          1.1     skrll #define R_H8_DIR16_X (R_H8_DIR32_X + 1)
     91          1.1     skrll   HOWTO (R_H8_DIR16,		/* type */
     92          1.1     skrll 	 0,			/* rightshift */
     93      1.1.1.9  christos 	 2,			/* size */
     94          1.1     skrll 	 16,			/* bitsize */
     95      1.1.1.9  christos 	 false,			/* pc_relative */
     96          1.1     skrll 	 0,			/* bitpos */
     97          1.1     skrll 	 complain_overflow_dont,/* complain_on_overflow */
     98          1.1     skrll 	 special,		/* special_function */
     99          1.1     skrll 	 "R_H8_DIR16",		/* name */
    100      1.1.1.9  christos 	 false,			/* partial_inplace */
    101          1.1     skrll 	 0,			/* src_mask */
    102          1.1     skrll 	 0x0000ffff,		/* dst_mask */
    103      1.1.1.9  christos 	 false),		/* pcrel_offset */
    104          1.1     skrll #define R_H8_DIR8_X (R_H8_DIR16_X + 1)
    105          1.1     skrll   HOWTO (R_H8_DIR8,		/* type */
    106          1.1     skrll 	 0,			/* rightshift */
    107      1.1.1.9  christos 	 1,			/* size */
    108          1.1     skrll 	 8,			/* bitsize */
    109      1.1.1.9  christos 	 false,			/* pc_relative */
    110          1.1     skrll 	 0,			/* bitpos */
    111          1.1     skrll 	 complain_overflow_dont,/* complain_on_overflow */
    112          1.1     skrll 	 special,		/* special_function */
    113          1.1     skrll 	 "R_H8_DIR8",		/* name */
    114      1.1.1.9  christos 	 false,			/* partial_inplace */
    115          1.1     skrll 	 0,			/* src_mask */
    116          1.1     skrll 	 0x000000ff,		/* dst_mask */
    117      1.1.1.9  christos 	 false),		/* pcrel_offset */
    118          1.1     skrll #define R_H8_DIR16A8_X (R_H8_DIR8_X + 1)
    119          1.1     skrll   HOWTO (R_H8_DIR16A8,		/* type */
    120          1.1     skrll 	 0,			/* rightshift */
    121      1.1.1.9  christos 	 2,			/* size */
    122          1.1     skrll 	 16,			/* bitsize */
    123      1.1.1.9  christos 	 false,			/* pc_relative */
    124          1.1     skrll 	 0,			/* bitpos */
    125          1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    126          1.1     skrll 	 special,		/* special_function */
    127          1.1     skrll 	 "R_H8_DIR16A8",	/* name */
    128      1.1.1.9  christos 	 false,			/* partial_inplace */
    129          1.1     skrll 	 0,			/* src_mask */
    130          1.1     skrll 	 0x0000ffff,		/* dst_mask */
    131      1.1.1.9  christos 	 false),		/* pcrel_offset */
    132          1.1     skrll #define R_H8_DIR16R8_X (R_H8_DIR16A8_X + 1)
    133          1.1     skrll   HOWTO (R_H8_DIR16R8,		/* type */
    134          1.1     skrll 	 0,			/* rightshift */
    135      1.1.1.9  christos 	 2,			/* size */
    136          1.1     skrll 	 16,			/* bitsize */
    137      1.1.1.9  christos 	 false,			/* pc_relative */
    138          1.1     skrll 	 0,			/* bitpos */
    139          1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    140          1.1     skrll 	 special,		/* special_function */
    141          1.1     skrll 	 "R_H8_DIR16R8",	/* name */
    142      1.1.1.9  christos 	 false,			/* partial_inplace */
    143          1.1     skrll 	 0,			/* src_mask */
    144          1.1     skrll 	 0x0000ffff,		/* dst_mask */
    145      1.1.1.9  christos 	 false),		/* pcrel_offset */
    146          1.1     skrll #define R_H8_DIR24A8_X (R_H8_DIR16R8_X + 1)
    147          1.1     skrll   HOWTO (R_H8_DIR24A8,		/* type */
    148          1.1     skrll 	 0,			/* rightshift */
    149      1.1.1.9  christos 	 4,			/* size */
    150          1.1     skrll 	 24,			/* bitsize */
    151      1.1.1.9  christos 	 false,			/* pc_relative */
    152          1.1     skrll 	 0,			/* bitpos */
    153          1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    154          1.1     skrll 	 special,		/* special_function */
    155          1.1     skrll 	 "R_H8_DIR24A8",	/* name */
    156      1.1.1.9  christos 	 true,			/* partial_inplace */
    157          1.1     skrll 	 0xff000000,		/* src_mask */
    158          1.1     skrll 	 0x00ffffff,		/* dst_mask */
    159      1.1.1.9  christos 	 false),		/* pcrel_offset */
    160          1.1     skrll #define R_H8_DIR24R8_X (R_H8_DIR24A8_X + 1)
    161          1.1     skrll   HOWTO (R_H8_DIR24R8,		/* type */
    162          1.1     skrll 	 0,			/* rightshift */
    163      1.1.1.9  christos 	 4,			/* size */
    164          1.1     skrll 	 24,			/* bitsize */
    165      1.1.1.9  christos 	 false,			/* pc_relative */
    166          1.1     skrll 	 0,			/* bitpos */
    167          1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    168          1.1     skrll 	 special,		/* special_function */
    169          1.1     skrll 	 "R_H8_DIR24R8",	/* name */
    170      1.1.1.9  christos 	 true,			/* partial_inplace */
    171          1.1     skrll 	 0xff000000,		/* src_mask */
    172          1.1     skrll 	 0x00ffffff,		/* dst_mask */
    173      1.1.1.9  christos 	 false),		/* pcrel_offset */
    174          1.1     skrll #define R_H8_DIR32A16_X (R_H8_DIR24R8_X + 1)
    175          1.1     skrll   HOWTO (R_H8_DIR32A16,		/* type */
    176          1.1     skrll 	 0,			/* rightshift */
    177      1.1.1.9  christos 	 4,			/* size */
    178          1.1     skrll 	 32,			/* bitsize */
    179      1.1.1.9  christos 	 false,			/* pc_relative */
    180          1.1     skrll 	 0,			/* bitpos */
    181          1.1     skrll 	 complain_overflow_dont,/* complain_on_overflow */
    182          1.1     skrll 	 special,		/* special_function */
    183          1.1     skrll 	 "R_H8_DIR32A16",	/* name */
    184      1.1.1.9  christos 	 false,			/* partial_inplace */
    185          1.1     skrll 	 0,			/* src_mask */
    186          1.1     skrll 	 0xffffffff,		/* dst_mask */
    187      1.1.1.9  christos 	 false),		/* pcrel_offset */
    188      1.1.1.4  christos #define R_H8_DISP32A16_X (R_H8_DIR32A16_X + 1)
    189      1.1.1.4  christos   HOWTO (R_H8_DISP32A16,	/* type */
    190      1.1.1.4  christos 	 0,			/* rightshift */
    191      1.1.1.9  christos 	 4,			/* size */
    192      1.1.1.4  christos 	 32,			/* bitsize */
    193      1.1.1.9  christos 	 false,			/* pc_relative */
    194      1.1.1.4  christos 	 0,			/* bitpos */
    195      1.1.1.4  christos 	 complain_overflow_dont,/* complain_on_overflow */
    196      1.1.1.4  christos 	 special,		/* special_function */
    197      1.1.1.4  christos 	 "R_H8_DISP32A16",	/* name */
    198      1.1.1.9  christos 	 false,			/* partial_inplace */
    199      1.1.1.4  christos 	 0,			/* src_mask */
    200      1.1.1.4  christos 	 0xffffffff,		/* dst_mask */
    201      1.1.1.9  christos 	 false),		/* pcrel_offset */
    202      1.1.1.4  christos #define R_H8_PCREL16_X (R_H8_DISP32A16_X + 1)
    203          1.1     skrll   HOWTO (R_H8_PCREL16,		/* type */
    204          1.1     skrll 	 0,			/* rightshift */
    205      1.1.1.9  christos 	 2,			/* size */
    206          1.1     skrll 	 16,			/* bitsize */
    207      1.1.1.9  christos 	 true,			/* pc_relative */
    208          1.1     skrll 	 0,			/* bitpos */
    209          1.1     skrll 	 complain_overflow_signed,/* complain_on_overflow */
    210          1.1     skrll 	 special,		/* special_function */
    211          1.1     skrll 	 "R_H8_PCREL16",	/* name */
    212      1.1.1.9  christos 	 false,			/* partial_inplace */
    213          1.1     skrll 	 0xffff,		/* src_mask */
    214          1.1     skrll 	 0xffff,		/* dst_mask */
    215      1.1.1.9  christos 	 true),			/* pcrel_offset */
    216          1.1     skrll #define R_H8_PCREL8_X (R_H8_PCREL16_X + 1)
    217          1.1     skrll   HOWTO (R_H8_PCREL8,		/* type */
    218          1.1     skrll 	 0,			/* rightshift */
    219      1.1.1.9  christos 	 1,			/* size */
    220          1.1     skrll 	 8,			/* bitsize */
    221      1.1.1.9  christos 	 true,			/* pc_relative */
    222          1.1     skrll 	 0,			/* bitpos */
    223          1.1     skrll 	 complain_overflow_signed,/* complain_on_overflow */
    224          1.1     skrll 	 special,		/* special_function */
    225          1.1     skrll 	 "R_H8_PCREL8",		/* name */
    226      1.1.1.9  christos 	 false,			/* partial_inplace */
    227          1.1     skrll 	 0xff,			/* src_mask */
    228          1.1     skrll 	 0xff,			/* dst_mask */
    229      1.1.1.9  christos 	 true),			/* pcrel_offset */
    230          1.1     skrll };
    231          1.1     skrll 
    232          1.1     skrll /* This structure is used to map BFD reloc codes to H8 ELF relocs.  */
    233          1.1     skrll 
    234          1.1     skrll struct elf_reloc_map {
    235          1.1     skrll   bfd_reloc_code_real_type bfd_reloc_val;
    236          1.1     skrll   unsigned char howto_index;
    237          1.1     skrll };
    238          1.1     skrll 
    239          1.1     skrll /* An array mapping BFD reloc codes to H8 ELF relocs.  */
    240          1.1     skrll 
    241          1.1     skrll static const struct elf_reloc_map h8_reloc_map[] = {
    242          1.1     skrll   { BFD_RELOC_NONE, R_H8_NONE_X },
    243          1.1     skrll   { BFD_RELOC_32, R_H8_DIR32_X },
    244          1.1     skrll   { BFD_RELOC_16, R_H8_DIR16_X },
    245          1.1     skrll   { BFD_RELOC_8, R_H8_DIR8_X },
    246          1.1     skrll   { BFD_RELOC_H8_DIR16A8, R_H8_DIR16A8_X },
    247          1.1     skrll   { BFD_RELOC_H8_DIR16R8, R_H8_DIR16R8_X },
    248          1.1     skrll   { BFD_RELOC_H8_DIR24A8, R_H8_DIR24A8_X },
    249          1.1     skrll   { BFD_RELOC_H8_DIR24R8, R_H8_DIR24R8_X },
    250          1.1     skrll   { BFD_RELOC_H8_DIR32A16, R_H8_DIR32A16_X },
    251      1.1.1.4  christos   { BFD_RELOC_H8_DISP32A16, R_H8_DISP32A16_X },
    252          1.1     skrll   { BFD_RELOC_16_PCREL, R_H8_PCREL16_X },
    253          1.1     skrll   { BFD_RELOC_8_PCREL, R_H8_PCREL8_X },
    254          1.1     skrll };
    255          1.1     skrll 
    256          1.1     skrll 
    257          1.1     skrll static reloc_howto_type *
    258          1.1     skrll elf32_h8_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    259          1.1     skrll 			    bfd_reloc_code_real_type code)
    260          1.1     skrll {
    261          1.1     skrll   unsigned int i;
    262          1.1     skrll 
    263          1.1     skrll   for (i = 0; i < sizeof (h8_reloc_map) / sizeof (struct elf_reloc_map); i++)
    264          1.1     skrll     {
    265          1.1     skrll       if (h8_reloc_map[i].bfd_reloc_val == code)
    266          1.1     skrll 	return &h8_elf_howto_table[(int) h8_reloc_map[i].howto_index];
    267          1.1     skrll     }
    268          1.1     skrll   return NULL;
    269          1.1     skrll }
    270          1.1     skrll 
    271          1.1     skrll static reloc_howto_type *
    272          1.1     skrll elf32_h8_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    273          1.1     skrll 			    const char *r_name)
    274          1.1     skrll {
    275          1.1     skrll   unsigned int i;
    276          1.1     skrll 
    277          1.1     skrll   for (i = 0;
    278          1.1     skrll        i < sizeof (h8_elf_howto_table) / sizeof (h8_elf_howto_table[0]);
    279          1.1     skrll        i++)
    280          1.1     skrll     if (h8_elf_howto_table[i].name != NULL
    281          1.1     skrll 	&& strcasecmp (h8_elf_howto_table[i].name, r_name) == 0)
    282          1.1     skrll       return &h8_elf_howto_table[i];
    283          1.1     skrll 
    284          1.1     skrll   return NULL;
    285          1.1     skrll }
    286          1.1     skrll 
    287      1.1.1.9  christos static bool
    288          1.1     skrll elf32_h8_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
    289          1.1     skrll 			Elf_Internal_Rela *elf_reloc)
    290          1.1     skrll {
    291          1.1     skrll   unsigned int r;
    292          1.1     skrll   unsigned int i;
    293          1.1     skrll 
    294          1.1     skrll   r = ELF32_R_TYPE (elf_reloc->r_info);
    295          1.1     skrll   for (i = 0; i < sizeof (h8_elf_howto_table) / sizeof (reloc_howto_type); i++)
    296          1.1     skrll     if (h8_elf_howto_table[i].type == r)
    297          1.1     skrll       {
    298          1.1     skrll 	bfd_reloc->howto = &h8_elf_howto_table[i];
    299      1.1.1.9  christos 	return true;
    300          1.1     skrll       }
    301      1.1.1.7  christos   /* xgettext:c-format */
    302      1.1.1.7  christos   _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, r);
    303      1.1.1.7  christos   bfd_set_error (bfd_error_bad_value);
    304      1.1.1.9  christos   return false;
    305          1.1     skrll }
    306          1.1     skrll 
    307      1.1.1.9  christos static bool
    308      1.1.1.7  christos elf32_h8_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
    309      1.1.1.7  christos 			    arelent *bfd_reloc ATTRIBUTE_UNUSED,
    310          1.1     skrll 			    Elf_Internal_Rela *elf_reloc ATTRIBUTE_UNUSED)
    311          1.1     skrll {
    312      1.1.1.9  christos   return false;
    313          1.1     skrll }
    314          1.1     skrll 
    315          1.1     skrll /* Special handling for H8/300 relocs.
    316          1.1     skrll    We only come here for pcrel stuff and return normally if not an -r link.
    317          1.1     skrll    When doing -r, we can't do any arithmetic for the pcrel stuff, because
    318          1.1     skrll    we support relaxing on the H8/300 series chips.  */
    319          1.1     skrll static bfd_reloc_status_type
    320          1.1     skrll special (bfd *abfd ATTRIBUTE_UNUSED,
    321          1.1     skrll 	 arelent *reloc_entry ATTRIBUTE_UNUSED,
    322          1.1     skrll 	 asymbol *symbol ATTRIBUTE_UNUSED,
    323      1.1.1.3  christos 	 void * data ATTRIBUTE_UNUSED,
    324          1.1     skrll 	 asection *input_section ATTRIBUTE_UNUSED,
    325          1.1     skrll 	 bfd *output_bfd,
    326          1.1     skrll 	 char **error_message ATTRIBUTE_UNUSED)
    327          1.1     skrll {
    328          1.1     skrll   if (output_bfd == (bfd *) NULL)
    329          1.1     skrll     return bfd_reloc_continue;
    330          1.1     skrll 
    331          1.1     skrll   /* Adjust the reloc address to that in the output section.  */
    332          1.1     skrll   reloc_entry->address += input_section->output_offset;
    333          1.1     skrll   return bfd_reloc_ok;
    334          1.1     skrll }
    335          1.1     skrll 
    336          1.1     skrll /* Perform a relocation as part of a final link.  */
    337          1.1     skrll static bfd_reloc_status_type
    338          1.1     skrll elf32_h8_final_link_relocate (unsigned long r_type, bfd *input_bfd,
    339          1.1     skrll 			      bfd *output_bfd ATTRIBUTE_UNUSED,
    340          1.1     skrll 			      asection *input_section ATTRIBUTE_UNUSED,
    341          1.1     skrll 			      bfd_byte *contents, bfd_vma offset,
    342          1.1     skrll 			      bfd_vma value, bfd_vma addend,
    343          1.1     skrll 			      struct bfd_link_info *info ATTRIBUTE_UNUSED,
    344          1.1     skrll 			      asection *sym_sec ATTRIBUTE_UNUSED,
    345          1.1     skrll 			      int is_local ATTRIBUTE_UNUSED)
    346          1.1     skrll {
    347          1.1     skrll   bfd_byte *hit_data = contents + offset;
    348          1.1     skrll 
    349          1.1     skrll   switch (r_type)
    350          1.1     skrll     {
    351          1.1     skrll     case R_H8_NONE:
    352          1.1     skrll       return bfd_reloc_ok;
    353          1.1     skrll 
    354          1.1     skrll     case R_H8_DIR32:
    355          1.1     skrll     case R_H8_DIR32A16:
    356      1.1.1.4  christos     case R_H8_DISP32A16:
    357          1.1     skrll     case R_H8_DIR24A8:
    358          1.1     skrll       value += addend;
    359          1.1     skrll       bfd_put_32 (input_bfd, value, hit_data);
    360          1.1     skrll       return bfd_reloc_ok;
    361          1.1     skrll 
    362          1.1     skrll     case R_H8_DIR16:
    363          1.1     skrll     case R_H8_DIR16A8:
    364          1.1     skrll     case R_H8_DIR16R8:
    365          1.1     skrll       value += addend;
    366          1.1     skrll       bfd_put_16 (input_bfd, value, hit_data);
    367          1.1     skrll       return bfd_reloc_ok;
    368          1.1     skrll 
    369          1.1     skrll     /* AKA R_RELBYTE */
    370          1.1     skrll     case R_H8_DIR8:
    371          1.1     skrll       value += addend;
    372          1.1     skrll 
    373          1.1     skrll       bfd_put_8 (input_bfd, value, hit_data);
    374          1.1     skrll       return bfd_reloc_ok;
    375          1.1     skrll 
    376          1.1     skrll     case R_H8_DIR24R8:
    377          1.1     skrll       value += addend;
    378          1.1     skrll 
    379          1.1     skrll       /* HIT_DATA is the address for the first byte for the relocated
    380          1.1     skrll 	 value.  Subtract 1 so that we can manipulate the data in 32-bit
    381          1.1     skrll 	 hunks.  */
    382          1.1     skrll       hit_data--;
    383          1.1     skrll 
    384          1.1     skrll       /* Clear out the top byte in value.  */
    385          1.1     skrll       value &= 0xffffff;
    386          1.1     skrll 
    387          1.1     skrll       /* Retrieve the type byte for value from the section contents.  */
    388          1.1     skrll       value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
    389          1.1     skrll 
    390          1.1     skrll       /* Now scribble it out in one 32-bit hunk.  */
    391          1.1     skrll       bfd_put_32 (input_bfd, value, hit_data);
    392          1.1     skrll       return bfd_reloc_ok;
    393          1.1     skrll 
    394          1.1     skrll     case R_H8_PCREL16:
    395          1.1     skrll       value -= (input_section->output_section->vma
    396          1.1     skrll 		+ input_section->output_offset);
    397          1.1     skrll       value -= offset;
    398          1.1     skrll       value += addend;
    399          1.1     skrll 
    400          1.1     skrll       /* The value is relative to the start of the instruction,
    401          1.1     skrll 	 not the relocation offset.  Subtract 2 to account for
    402          1.1     skrll 	 this minor issue.  */
    403          1.1     skrll       value -= 2;
    404          1.1     skrll 
    405          1.1     skrll       bfd_put_16 (input_bfd, value, hit_data);
    406          1.1     skrll       return bfd_reloc_ok;
    407          1.1     skrll 
    408          1.1     skrll     case R_H8_PCREL8:
    409          1.1     skrll       value -= (input_section->output_section->vma
    410          1.1     skrll 		+ input_section->output_offset);
    411          1.1     skrll       value -= offset;
    412          1.1     skrll       value += addend;
    413          1.1     skrll 
    414          1.1     skrll       /* The value is relative to the start of the instruction,
    415          1.1     skrll 	 not the relocation offset.  Subtract 1 to account for
    416          1.1     skrll 	 this minor issue.  */
    417          1.1     skrll       value -= 1;
    418          1.1     skrll 
    419          1.1     skrll       bfd_put_8 (input_bfd, value, hit_data);
    420          1.1     skrll       return bfd_reloc_ok;
    421          1.1     skrll 
    422          1.1     skrll     default:
    423          1.1     skrll       return bfd_reloc_notsupported;
    424          1.1     skrll     }
    425          1.1     skrll }
    426          1.1     skrll 
    427          1.1     skrll /* Relocate an H8 ELF section.  */
    429          1.1     skrll static int
    430          1.1     skrll elf32_h8_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
    431          1.1     skrll 			   bfd *input_bfd, asection *input_section,
    432          1.1     skrll 			   bfd_byte *contents, Elf_Internal_Rela *relocs,
    433          1.1     skrll 			   Elf_Internal_Sym *local_syms,
    434          1.1     skrll 			   asection **local_sections)
    435          1.1     skrll {
    436          1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
    437          1.1     skrll   struct elf_link_hash_entry **sym_hashes;
    438          1.1     skrll   Elf_Internal_Rela *rel, *relend;
    439          1.1     skrll 
    440          1.1     skrll   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
    441          1.1     skrll   sym_hashes = elf_sym_hashes (input_bfd);
    442          1.1     skrll 
    443          1.1     skrll   rel = relocs;
    444          1.1     skrll   relend = relocs + input_section->reloc_count;
    445          1.1     skrll   for (; rel < relend; rel++)
    446          1.1     skrll     {
    447          1.1     skrll       unsigned int r_type;
    448          1.1     skrll       unsigned long r_symndx;
    449          1.1     skrll       Elf_Internal_Sym *sym;
    450          1.1     skrll       asection *sec;
    451          1.1     skrll       struct elf_link_hash_entry *h;
    452          1.1     skrll       bfd_vma relocation;
    453          1.1     skrll       bfd_reloc_status_type r;
    454          1.1     skrll       arelent bfd_reloc;
    455          1.1     skrll       reloc_howto_type *howto;
    456      1.1.1.7  christos 
    457      1.1.1.7  christos       if (! elf32_h8_info_to_howto (input_bfd, &bfd_reloc, rel))
    458          1.1     skrll 	continue;
    459          1.1     skrll       howto = bfd_reloc.howto;
    460          1.1     skrll 
    461          1.1     skrll       r_symndx = ELF32_R_SYM (rel->r_info);
    462          1.1     skrll       r_type = ELF32_R_TYPE (rel->r_info);
    463          1.1     skrll       h = NULL;
    464          1.1     skrll       sym = NULL;
    465          1.1     skrll       sec = NULL;
    466          1.1     skrll       if (r_symndx < symtab_hdr->sh_info)
    467          1.1     skrll 	{
    468          1.1     skrll 	  sym = local_syms + r_symndx;
    469          1.1     skrll 	  sec = local_sections[r_symndx];
    470          1.1     skrll 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
    471          1.1     skrll 	}
    472          1.1     skrll       else
    473      1.1.1.9  christos 	{
    474          1.1     skrll 	  bool unresolved_reloc, warned, ignored;
    475          1.1     skrll 
    476          1.1     skrll 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
    477          1.1     skrll 				   r_symndx, symtab_hdr, sym_hashes,
    478      1.1.1.4  christos 				   h, sec, relocation,
    479          1.1     skrll 				   unresolved_reloc, warned, ignored);
    480          1.1     skrll 	}
    481      1.1.1.3  christos 
    482      1.1.1.2  christos       if (sec != NULL && discarded_section (sec))
    483      1.1.1.3  christos 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
    484          1.1     skrll 					 rel, 1, relend, howto, 0, contents);
    485      1.1.1.4  christos 
    486          1.1     skrll       if (bfd_link_relocatable (info))
    487          1.1     skrll 	continue;
    488          1.1     skrll 
    489          1.1     skrll       r = elf32_h8_final_link_relocate (r_type, input_bfd, output_bfd,
    490          1.1     skrll 					input_section,
    491          1.1     skrll 					contents, rel->r_offset,
    492          1.1     skrll 					relocation, rel->r_addend,
    493          1.1     skrll 					info, sec, h == NULL);
    494          1.1     skrll 
    495          1.1     skrll       if (r != bfd_reloc_ok)
    496          1.1     skrll 	{
    497          1.1     skrll 	  const char *name;
    498          1.1     skrll 	  const char *msg = (const char *) 0;
    499          1.1     skrll 
    500          1.1     skrll 	  if (h != NULL)
    501          1.1     skrll 	    name = h->root.root.string;
    502          1.1     skrll 	  else
    503          1.1     skrll 	    {
    504          1.1     skrll 	      name = (bfd_elf_string_from_elf_section
    505          1.1     skrll 		      (input_bfd, symtab_hdr->sh_link, sym->st_name));
    506      1.1.1.8  christos 	      if (name == NULL || *name == '\0')
    507          1.1     skrll 		name = bfd_section_name (sec);
    508          1.1     skrll 	    }
    509          1.1     skrll 
    510          1.1     skrll 	  switch (r)
    511          1.1     skrll 	    {
    512      1.1.1.5  christos 	    case bfd_reloc_overflow:
    513      1.1.1.5  christos 	      (*info->callbacks->reloc_overflow)
    514      1.1.1.5  christos 		(info, (h ? &h->root : NULL), name, howto->name,
    515          1.1     skrll 		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
    516          1.1     skrll 	      break;
    517          1.1     skrll 
    518      1.1.1.5  christos 	    case bfd_reloc_undefined:
    519      1.1.1.9  christos 	      (*info->callbacks->undefined_symbol)
    520          1.1     skrll 		(info, name, input_bfd, input_section, rel->r_offset, true);
    521          1.1     skrll 	      break;
    522          1.1     skrll 
    523          1.1     skrll 	    case bfd_reloc_outofrange:
    524          1.1     skrll 	      msg = _("internal error: out of range error");
    525          1.1     skrll 	      goto common_error;
    526          1.1     skrll 
    527          1.1     skrll 	    case bfd_reloc_notsupported:
    528          1.1     skrll 	      msg = _("internal error: unsupported relocation error");
    529          1.1     skrll 	      goto common_error;
    530          1.1     skrll 
    531          1.1     skrll 	    case bfd_reloc_dangerous:
    532          1.1     skrll 	      msg = _("internal error: dangerous error");
    533          1.1     skrll 	      goto common_error;
    534          1.1     skrll 
    535          1.1     skrll 	    default:
    536          1.1     skrll 	      msg = _("internal error: unknown error");
    537          1.1     skrll 	      /* fall through */
    538          1.1     skrll 
    539      1.1.1.5  christos 	    common_error:
    540      1.1.1.5  christos 	      (*info->callbacks->warning) (info, msg, name, input_bfd,
    541          1.1     skrll 					   input_section, rel->r_offset);
    542          1.1     skrll 	      break;
    543          1.1     skrll 	    }
    544          1.1     skrll 	}
    545          1.1     skrll     }
    546      1.1.1.9  christos 
    547          1.1     skrll   return true;
    548          1.1     skrll }
    549          1.1     skrll 
    550          1.1     skrll /* Object files encode the specific H8 model they were compiled
    551          1.1     skrll    for in the ELF flags field.
    552          1.1     skrll 
    553          1.1     skrll    Examine that field and return the proper BFD machine type for
    554          1.1     skrll    the object file.  */
    555          1.1     skrll static unsigned long
    556          1.1     skrll elf32_h8_mach (flagword flags)
    557          1.1     skrll {
    558          1.1     skrll   switch (flags & EF_H8_MACH)
    559          1.1     skrll     {
    560          1.1     skrll     case E_H8_MACH_H8300:
    561          1.1     skrll     default:
    562          1.1     skrll       return bfd_mach_h8300;
    563          1.1     skrll 
    564          1.1     skrll     case E_H8_MACH_H8300H:
    565          1.1     skrll       return bfd_mach_h8300h;
    566          1.1     skrll 
    567          1.1     skrll     case E_H8_MACH_H8300S:
    568          1.1     skrll       return bfd_mach_h8300s;
    569          1.1     skrll 
    570          1.1     skrll     case E_H8_MACH_H8300HN:
    571          1.1     skrll       return bfd_mach_h8300hn;
    572          1.1     skrll 
    573          1.1     skrll     case E_H8_MACH_H8300SN:
    574          1.1     skrll       return bfd_mach_h8300sn;
    575          1.1     skrll 
    576          1.1     skrll     case E_H8_MACH_H8300SX:
    577          1.1     skrll       return bfd_mach_h8300sx;
    578          1.1     skrll 
    579          1.1     skrll     case E_H8_MACH_H8300SXN:
    580          1.1     skrll       return bfd_mach_h8300sxn;
    581          1.1     skrll     }
    582          1.1     skrll }
    583          1.1     skrll 
    584          1.1     skrll /* The final processing done just before writing out a H8 ELF object
    585          1.1     skrll    file.  We use this opportunity to encode the BFD machine type
    586          1.1     skrll    into the flags field in the object file.  */
    587      1.1.1.9  christos 
    588      1.1.1.8  christos static bool
    589          1.1     skrll elf32_h8_final_write_processing (bfd *abfd)
    590          1.1     skrll {
    591          1.1     skrll   unsigned long val;
    592          1.1     skrll 
    593          1.1     skrll   switch (bfd_get_mach (abfd))
    594          1.1     skrll     {
    595          1.1     skrll     default:
    596          1.1     skrll     case bfd_mach_h8300:
    597          1.1     skrll       val = E_H8_MACH_H8300;
    598          1.1     skrll       break;
    599          1.1     skrll 
    600          1.1     skrll     case bfd_mach_h8300h:
    601          1.1     skrll       val = E_H8_MACH_H8300H;
    602          1.1     skrll       break;
    603          1.1     skrll 
    604          1.1     skrll     case bfd_mach_h8300s:
    605          1.1     skrll       val = E_H8_MACH_H8300S;
    606          1.1     skrll       break;
    607          1.1     skrll 
    608          1.1     skrll     case bfd_mach_h8300hn:
    609          1.1     skrll       val = E_H8_MACH_H8300HN;
    610          1.1     skrll       break;
    611          1.1     skrll 
    612          1.1     skrll     case bfd_mach_h8300sn:
    613          1.1     skrll       val = E_H8_MACH_H8300SN;
    614          1.1     skrll       break;
    615          1.1     skrll 
    616          1.1     skrll     case bfd_mach_h8300sx:
    617          1.1     skrll       val = E_H8_MACH_H8300SX;
    618          1.1     skrll       break;
    619          1.1     skrll 
    620          1.1     skrll     case bfd_mach_h8300sxn:
    621          1.1     skrll       val = E_H8_MACH_H8300SXN;
    622          1.1     skrll       break;
    623          1.1     skrll     }
    624          1.1     skrll 
    625          1.1     skrll   elf_elfheader (abfd)->e_flags &= ~ (EF_H8_MACH);
    626      1.1.1.8  christos   elf_elfheader (abfd)->e_flags |= val;
    627          1.1     skrll   return _bfd_elf_final_write_processing (abfd);
    628          1.1     skrll }
    629          1.1     skrll 
    630          1.1     skrll /* Return nonzero if ABFD represents a valid H8 ELF object file; also
    631          1.1     skrll    record the encoded machine type found in the ELF flags.  */
    632      1.1.1.9  christos 
    633          1.1     skrll static bool
    634          1.1     skrll elf32_h8_object_p (bfd *abfd)
    635          1.1     skrll {
    636          1.1     skrll   bfd_default_set_arch_mach (abfd, bfd_arch_h8300,
    637      1.1.1.9  christos 			     elf32_h8_mach (elf_elfheader (abfd)->e_flags));
    638          1.1     skrll   return true;
    639          1.1     skrll }
    640          1.1     skrll 
    641          1.1     skrll /* Merge backend specific data from an object file to the output
    642          1.1     skrll    object file when linking.  The only data we need to copy at this
    643          1.1     skrll    time is the architecture/machine information.  */
    644      1.1.1.9  christos 
    645      1.1.1.6  christos static bool
    646          1.1     skrll elf32_h8_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
    647      1.1.1.6  christos {
    648      1.1.1.6  christos   bfd *obfd = info->output_bfd;
    649          1.1     skrll 
    650          1.1     skrll   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
    651      1.1.1.9  christos       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
    652          1.1     skrll     return true;
    653          1.1     skrll 
    654          1.1     skrll   if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
    655          1.1     skrll       && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
    656          1.1     skrll     {
    657          1.1     skrll       if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
    658      1.1.1.9  christos 			       bfd_get_mach (ibfd)))
    659          1.1     skrll 	return false;
    660          1.1     skrll     }
    661      1.1.1.9  christos 
    662          1.1     skrll   return true;
    663          1.1     skrll }
    664          1.1     skrll 
    665          1.1     skrll /* This function handles relaxing for the H8..
    666          1.1     skrll 
    667          1.1     skrll    There are a few relaxing opportunities available on the H8:
    668      1.1.1.6  christos 
    669          1.1     skrll      jmp/jsr:24	   ->	 bra/bsr:8		2 bytes
    670          1.1     skrll      The jmp may be completely eliminated if the previous insn is a
    671          1.1     skrll      conditional branch to the insn after the jump.  In that case
    672          1.1     skrll      we invert the branch and delete the jump and save 4 bytes.
    673      1.1.1.6  christos 
    674      1.1.1.6  christos      bCC:16	     ->	   bCC:8		  2 bytes
    675          1.1     skrll      bsr:16	     ->	   bsr:8		  2 bytes
    676      1.1.1.6  christos 
    677      1.1.1.6  christos      bset:16	     ->	   bset:8		  2 bytes
    678          1.1     skrll      bset:24/32	     ->	   bset:8		  4 bytes
    679          1.1     skrll      (also applicable to other bit manipulation instructions)
    680      1.1.1.6  christos 
    681      1.1.1.6  christos      mov.b:16	     ->	   mov.b:8		  2 bytes
    682          1.1     skrll      mov.b:24/32     ->	   mov.b:8		  4 bytes
    683      1.1.1.6  christos 
    684          1.1     skrll      bset:24/32	     ->	   bset:16		  2 bytes
    685          1.1     skrll      (also applicable to other bit manipulation instructions)
    686      1.1.1.6  christos 
    687      1.1.1.4  christos      mov.[bwl]:24/32 ->	   mov.[bwl]:16		  2 bytes
    688      1.1.1.6  christos 
    689          1.1     skrll      mov.[bwl] @(displ:24/32+ERx) -> mov.[bwl] @(displ:16+ERx)	4 bytes.  */
    690      1.1.1.9  christos 
    691          1.1     skrll static bool
    692      1.1.1.9  christos elf32_h8_relax_section (bfd *abfd, asection *sec,
    693          1.1     skrll 			struct bfd_link_info *link_info, bool *again)
    694          1.1     skrll {
    695          1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
    696          1.1     skrll   Elf_Internal_Rela *internal_relocs;
    697          1.1     skrll   Elf_Internal_Rela *irel, *irelend;
    698          1.1     skrll   bfd_byte *contents = NULL;
    699          1.1     skrll   Elf_Internal_Sym *isymbuf = NULL;
    700          1.1     skrll   static asection *last_input_section = NULL;
    701          1.1     skrll   static Elf_Internal_Rela *last_reloc = NULL;
    702          1.1     skrll 
    703      1.1.1.9  christos   /* Assume nothing changes.  */
    704          1.1     skrll   *again = false;
    705          1.1     skrll 
    706          1.1     skrll   /* We don't have to do anything for a relocatable link, if
    707          1.1     skrll      this section does not have relocs, or if this is not a
    708      1.1.1.4  christos      code section.  */
    709          1.1     skrll   if (bfd_link_relocatable (link_info)
    710  1.1.1.9.2.1  perseant       || sec->reloc_count == 0
    711  1.1.1.9.2.1  perseant       || (sec->flags & SEC_RELOC) == 0
    712          1.1     skrll       || (sec->flags & SEC_HAS_CONTENTS) == 0
    713      1.1.1.9  christos       || (sec->flags & SEC_CODE) == 0)
    714          1.1     skrll     return true;
    715          1.1     skrll 
    716          1.1     skrll   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
    717          1.1     skrll 
    718          1.1     skrll   /* Get a copy of the native relocations.  */
    719      1.1.1.3  christos   internal_relocs = (_bfd_elf_link_read_relocs
    720          1.1     skrll 		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
    721          1.1     skrll 		      link_info->keep_memory));
    722          1.1     skrll   if (internal_relocs == NULL)
    723          1.1     skrll     goto error_return;
    724          1.1     skrll 
    725          1.1     skrll   if (sec != last_input_section)
    726          1.1     skrll     last_reloc = NULL;
    727          1.1     skrll 
    728          1.1     skrll   last_input_section = sec;
    729          1.1     skrll 
    730          1.1     skrll   /* Walk through the relocs looking for relaxing opportunities.  */
    731          1.1     skrll   irelend = internal_relocs + sec->reloc_count;
    732          1.1     skrll   for (irel = internal_relocs; irel < irelend; irel++)
    733          1.1     skrll     {
    734          1.1     skrll       bfd_vma symval;
    735      1.1.1.2  christos 
    736      1.1.1.2  christos       {
    737      1.1.1.2  christos 	arelent bfd_reloc;
    738      1.1.1.7  christos 
    739      1.1.1.7  christos 	if (! elf32_h8_info_to_howto (abfd, &bfd_reloc, irel))
    740      1.1.1.2  christos 	  continue;
    741          1.1     skrll       }
    742          1.1     skrll       /* Keep track of the previous reloc so that we can delete
    743          1.1     skrll 	 some long jumps created by the compiler.  */
    744          1.1     skrll       if (irel != internal_relocs)
    745          1.1     skrll 	last_reloc = irel - 1;
    746      1.1.1.4  christos 
    747      1.1.1.4  christos       switch(ELF32_R_TYPE (irel->r_info))
    748      1.1.1.4  christos 	{
    749      1.1.1.4  christos 	case R_H8_DIR24R8:
    750      1.1.1.4  christos 	case R_H8_PCREL16:
    751      1.1.1.4  christos 	case R_H8_DIR16A8:
    752      1.1.1.4  christos 	case R_H8_DIR24A8:
    753      1.1.1.4  christos 	case R_H8_DIR32A16:
    754      1.1.1.4  christos 	case R_H8_DISP32A16:
    755      1.1.1.4  christos 	  break;
    756      1.1.1.4  christos 	default:
    757      1.1.1.4  christos 	  continue;
    758          1.1     skrll 	}
    759          1.1     skrll 
    760          1.1     skrll       /* Get the section contents if we haven't done so already.  */
    761          1.1     skrll       if (contents == NULL)
    762          1.1     skrll 	{
    763          1.1     skrll 	  /* Get cached copy if it exists.  */
    764          1.1     skrll 	  if (elf_section_data (sec)->this_hdr.contents != NULL)
    765          1.1     skrll 	    contents = elf_section_data (sec)->this_hdr.contents;
    766          1.1     skrll 	  else
    767          1.1     skrll 	    {
    768          1.1     skrll 	      /* Go get them off disk.  */
    769          1.1     skrll 	      if (!bfd_malloc_and_get_section (abfd, sec, &contents))
    770          1.1     skrll 		goto error_return;
    771          1.1     skrll 	    }
    772          1.1     skrll 	}
    773          1.1     skrll 
    774          1.1     skrll       /* Read this BFD's local symbols if we haven't done so already.  */
    775          1.1     skrll       if (isymbuf == NULL && symtab_hdr->sh_info != 0)
    776          1.1     skrll 	{
    777          1.1     skrll 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
    778          1.1     skrll 	  if (isymbuf == NULL)
    779          1.1     skrll 	    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
    780          1.1     skrll 					    symtab_hdr->sh_info, 0,
    781          1.1     skrll 					    NULL, NULL, NULL);
    782          1.1     skrll 	  if (isymbuf == NULL)
    783          1.1     skrll 	    goto error_return;
    784          1.1     skrll 	}
    785          1.1     skrll 
    786          1.1     skrll       /* Get the value of the symbol referred to by the reloc.  */
    787          1.1     skrll       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
    788          1.1     skrll 	{
    789          1.1     skrll 	  /* A local symbol.  */
    790          1.1     skrll 	  Elf_Internal_Sym *isym;
    791          1.1     skrll 	  asection *sym_sec;
    792          1.1     skrll 
    793          1.1     skrll 	  isym = isymbuf + ELF32_R_SYM (irel->r_info);
    794          1.1     skrll 	  sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
    795          1.1     skrll 	  symval = isym->st_value;
    796          1.1     skrll 	  /* If the reloc is absolute, it will not have
    797          1.1     skrll 	     a symbol or section associated with it.  */
    798          1.1     skrll 	  if (sym_sec)
    799          1.1     skrll 	    symval += sym_sec->output_section->vma
    800          1.1     skrll 	      + sym_sec->output_offset;
    801          1.1     skrll 	}
    802          1.1     skrll       else
    803          1.1     skrll 	{
    804          1.1     skrll 	  unsigned long indx;
    805          1.1     skrll 	  struct elf_link_hash_entry *h;
    806          1.1     skrll 
    807          1.1     skrll 	  /* An external symbol.  */
    808          1.1     skrll 	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
    809          1.1     skrll 	  h = elf_sym_hashes (abfd)[indx];
    810          1.1     skrll 	  BFD_ASSERT (h != NULL);
    811          1.1     skrll 	  if (h->root.type != bfd_link_hash_defined
    812          1.1     skrll 	      && h->root.type != bfd_link_hash_defweak)
    813          1.1     skrll 	    {
    814      1.1.1.6  christos 	      /* This appears to be a reference to an undefined
    815      1.1.1.6  christos 		 symbol.  Just ignore it--it will be caught by the
    816          1.1     skrll 		 regular reloc processing.  */
    817          1.1     skrll 	      continue;
    818          1.1     skrll 	    }
    819          1.1     skrll 
    820          1.1     skrll 	  symval = (h->root.u.def.value
    821          1.1     skrll 		    + h->root.u.def.section->output_section->vma
    822          1.1     skrll 		    + h->root.u.def.section->output_offset);
    823          1.1     skrll 	}
    824          1.1     skrll 
    825          1.1     skrll       /* For simplicity of coding, we are going to modify the section
    826          1.1     skrll 	 contents, the section relocs, and the BFD symbol table.  We
    827          1.1     skrll 	 must tell the rest of the code not to free up this
    828          1.1     skrll 	 information.  It would be possible to instead create a table
    829          1.1     skrll 	 of changes which have to be made, as is done in coff-mips.c;
    830          1.1     skrll 	 that would be more work, but would require less memory when
    831          1.1     skrll 	 the linker is run.  */
    832          1.1     skrll       switch (ELF32_R_TYPE (irel->r_info))
    833      1.1.1.4  christos 	{
    834      1.1.1.4  christos 	  /* Try to turn a 24-bit absolute branch/call into an 8-bit
    835          1.1     skrll 	     pc-relative branch/call.  */
    836          1.1     skrll 	case R_H8_DIR24R8:
    837          1.1     skrll 	  {
    838          1.1     skrll 	    bfd_vma value = symval + irel->r_addend;
    839          1.1     skrll 	    bfd_vma dot, gap;
    840          1.1     skrll 
    841          1.1     skrll 	    /* Get the address of this instruction.  */
    842          1.1     skrll 	    dot = (sec->output_section->vma
    843          1.1     skrll 		   + sec->output_offset + irel->r_offset - 1);
    844          1.1     skrll 
    845          1.1     skrll 	    /* Compute the distance from this insn to the branch target.  */
    846          1.1     skrll 	    gap = value - dot;
    847          1.1     skrll 
    848          1.1     skrll 	    /* If the distance is within -126..+130 inclusive, then we can
    849          1.1     skrll 	       relax this jump.  +130 is valid since the target will move
    850          1.1     skrll 	       two bytes closer if we do relax this branch.  */
    851          1.1     skrll 	    if ((int) gap >= -126 && (int) gap <= 130)
    852          1.1     skrll 	      {
    853          1.1     skrll 		unsigned char code;
    854          1.1     skrll 
    855          1.1     skrll 		/* Note that we've changed the relocs, section contents,
    856          1.1     skrll 		   etc.  */
    857          1.1     skrll 		elf_section_data (sec)->relocs = internal_relocs;
    858          1.1     skrll 		elf_section_data (sec)->this_hdr.contents = contents;
    859          1.1     skrll 		symtab_hdr->contents = (unsigned char *) isymbuf;
    860          1.1     skrll 
    861          1.1     skrll 		/* Get the instruction code being relaxed.  */
    862          1.1     skrll 		code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
    863          1.1     skrll 
    864          1.1     skrll 		/* If the previous instruction conditionally jumped around
    865          1.1     skrll 		   this instruction, we may be able to reverse the condition
    866          1.1     skrll 		   and redirect the previous instruction to the target of
    867          1.1     skrll 		   this instruction.
    868          1.1     skrll 
    869          1.1     skrll 		   Such sequences are used by the compiler to deal with
    870          1.1     skrll 		   long conditional branches.
    871          1.1     skrll 
    872          1.1     skrll 		   Only perform this optimisation for jumps (code 0x5a) not
    873          1.1     skrll 		   subroutine calls, as otherwise it could transform:
    874      1.1.1.4  christos 
    875      1.1.1.4  christos 		   mov.w   r0,r0
    876      1.1.1.4  christos 		   beq     .L1
    877      1.1.1.4  christos 		   jsr     @_bar
    878      1.1.1.4  christos 		   .L1:   rts
    879          1.1     skrll 		   _bar:  rts
    880      1.1.1.4  christos 		   into:
    881      1.1.1.4  christos 		   mov.w   r0,r0
    882      1.1.1.4  christos 		   bne     _bar
    883      1.1.1.4  christos 		   rts
    884          1.1     skrll 		   _bar:  rts
    885          1.1     skrll 
    886      1.1.1.4  christos 		   which changes the call (jsr) into a branch (bne).  */
    887          1.1     skrll 		if (code == 0x5a	/* jmp24.  */
    888          1.1     skrll 		    && (int) gap <= 130
    889          1.1     skrll 		    && (int) gap >= -128
    890          1.1     skrll 		    && last_reloc
    891          1.1     skrll 		    && ELF32_R_TYPE (last_reloc->r_info) == R_H8_PCREL8
    892          1.1     skrll 		    && ELF32_R_SYM (last_reloc->r_info) < symtab_hdr->sh_info)
    893          1.1     skrll 		  {
    894          1.1     skrll 		    bfd_vma last_value;
    895          1.1     skrll 		    asection *last_sym_sec;
    896          1.1     skrll 		    Elf_Internal_Sym *last_sym;
    897          1.1     skrll 
    898          1.1     skrll 		    /* We will need to examine the symbol used by the
    899          1.1     skrll 		       previous relocation.  */
    900          1.1     skrll 
    901          1.1     skrll 		    last_sym = isymbuf + ELF32_R_SYM (last_reloc->r_info);
    902          1.1     skrll 		    last_sym_sec
    903          1.1     skrll 		      = bfd_section_from_elf_index (abfd, last_sym->st_shndx);
    904          1.1     skrll 		    last_value = (last_sym->st_value
    905          1.1     skrll 				  + last_sym_sec->output_section->vma
    906          1.1     skrll 				  + last_sym_sec->output_offset);
    907          1.1     skrll 
    908          1.1     skrll 		    /* Verify that the previous relocation was for a
    909          1.1     skrll 		       branch around this instruction and that no symbol
    910          1.1     skrll 		       exists at the current location.  */
    911          1.1     skrll 		    if (last_value == dot + 4
    912          1.1     skrll 			&& last_reloc->r_offset + 2 == irel->r_offset
    913          1.1     skrll 			&& ! elf32_h8_symbol_address_p (abfd, sec, dot))
    914          1.1     skrll 		      {
    915          1.1     skrll 			/* We can eliminate this jump.  Twiddle the
    916          1.1     skrll 			   previous relocation as necessary.  */
    917          1.1     skrll 			irel->r_info
    918          1.1     skrll 			  = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
    919          1.1     skrll 					  ELF32_R_TYPE (R_H8_NONE));
    920          1.1     skrll 
    921          1.1     skrll 			last_reloc->r_info
    922          1.1     skrll 			  = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
    923          1.1     skrll 					  ELF32_R_TYPE (R_H8_PCREL8));
    924          1.1     skrll 			last_reloc->r_addend = irel->r_addend;
    925          1.1     skrll 
    926          1.1     skrll 			code = bfd_get_8 (abfd,
    927          1.1     skrll 					  contents + last_reloc->r_offset - 1);
    928          1.1     skrll 			code ^= 1;
    929          1.1     skrll 			bfd_put_8 (abfd,
    930      1.1.1.4  christos 				   code,
    931          1.1     skrll 				   contents + last_reloc->r_offset - 1);
    932          1.1     skrll 
    933          1.1     skrll 			/* Delete four bytes of data.  */
    934          1.1     skrll 			if (!elf32_h8_relax_delete_bytes (abfd, sec,
    935          1.1     skrll 							  irel->r_offset - 1,
    936          1.1     skrll 							  4))
    937          1.1     skrll 			  goto error_return;
    938      1.1.1.9  christos 
    939          1.1     skrll 			*again = true;
    940          1.1     skrll 			break;
    941          1.1     skrll 		      }
    942          1.1     skrll 		  }
    943          1.1     skrll 
    944      1.1.1.4  christos 		if (code == 0x5e)
    945      1.1.1.4  christos 		  /* This is jsr24  */
    946          1.1     skrll 		  bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 1);	/* bsr8. */
    947      1.1.1.4  christos 		else if (code == 0x5a)
    948      1.1.1.4  christos 		  /* This is jmp24  */
    949          1.1     skrll 		  bfd_put_8 (abfd, 0x40, contents + irel->r_offset - 1);	/* bra8. */
    950          1.1     skrll 		else
    951          1.1     skrll 		  abort ();
    952          1.1     skrll 
    953          1.1     skrll 		/* Fix the relocation's type.  */
    954          1.1     skrll 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
    955          1.1     skrll 					     R_H8_PCREL8);
    956          1.1     skrll 
    957          1.1     skrll 		/* Delete two bytes of data.  */
    958          1.1     skrll 		if (!elf32_h8_relax_delete_bytes (abfd, sec,
    959          1.1     skrll 						  irel->r_offset + 1, 2))
    960          1.1     skrll 		  goto error_return;
    961          1.1     skrll 
    962          1.1     skrll 		/* That will change things, so, we should relax again.
    963      1.1.1.9  christos 		   Note that this is not required, and it may be slow.  */
    964          1.1     skrll 		*again = true;
    965          1.1     skrll 	      }
    966          1.1     skrll 	    break;
    967          1.1     skrll 	  }
    968      1.1.1.4  christos 
    969      1.1.1.4  christos 	  /* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative
    970          1.1     skrll 	     branch.  */
    971          1.1     skrll 	case R_H8_PCREL16:
    972          1.1     skrll 	  {
    973          1.1     skrll 	    bfd_vma value = symval + irel->r_addend;
    974          1.1     skrll 	    bfd_vma dot;
    975          1.1     skrll 	    bfd_vma gap;
    976          1.1     skrll 
    977          1.1     skrll 	    /* Get the address of this instruction.  */
    978          1.1     skrll 	    dot = (sec->output_section->vma
    979          1.1     skrll 		   + sec->output_offset
    980          1.1     skrll 		   + irel->r_offset - 2);
    981          1.1     skrll 
    982          1.1     skrll 	    gap = value - dot;
    983          1.1     skrll 
    984          1.1     skrll 	    /* If the distance is within -126..+130 inclusive, then we can
    985          1.1     skrll 	       relax this jump.  +130 is valid since the target will move
    986          1.1     skrll 	       two bytes closer if we do relax this branch.  */
    987          1.1     skrll 	    if ((int) gap >= -126 && (int) gap <= 130)
    988          1.1     skrll 	      {
    989          1.1     skrll 		unsigned char code;
    990          1.1     skrll 
    991          1.1     skrll 		/* Note that we've changed the relocs, section contents,
    992          1.1     skrll 		   etc.  */
    993          1.1     skrll 		elf_section_data (sec)->relocs = internal_relocs;
    994          1.1     skrll 		elf_section_data (sec)->this_hdr.contents = contents;
    995          1.1     skrll 		symtab_hdr->contents = (unsigned char *) isymbuf;
    996          1.1     skrll 
    997          1.1     skrll 		/* Get the opcode.  */
    998          1.1     skrll 		code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
    999          1.1     skrll 
   1000          1.1     skrll 		if (code == 0x58)
   1001          1.1     skrll 		  {
   1002          1.1     skrll 		    /* bCC:16 -> bCC:8 */
   1003          1.1     skrll 		    /* Get the second byte of the original insn, which
   1004          1.1     skrll 		       contains the condition code.  */
   1005          1.1     skrll 		    code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
   1006      1.1.1.4  christos 
   1007          1.1     skrll 		    /* Compute the first byte of the relaxed
   1008          1.1     skrll 		       instruction.  The original sequence 0x58 0xX0
   1009          1.1     skrll 		       is relaxed to 0x4X, where X represents the
   1010          1.1     skrll 		       condition code.  */
   1011          1.1     skrll 		    code &= 0xf0;
   1012          1.1     skrll 		    code >>= 4;
   1013      1.1.1.4  christos 		    code |= 0x40;
   1014          1.1     skrll 		    bfd_put_8 (abfd, code, contents + irel->r_offset - 2); /* bCC:8.  */
   1015      1.1.1.4  christos 		  }
   1016          1.1     skrll 		else if (code == 0x5c)	/* bsr16.  */
   1017      1.1.1.4  christos 		  /* This is bsr.  */
   1018          1.1     skrll 		  bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 2);  /* bsr8.  */
   1019      1.1.1.2  christos 		else
   1020      1.1.1.2  christos 		  /* Might be MOVSD.  */
   1021          1.1     skrll 		  break;
   1022          1.1     skrll 
   1023          1.1     skrll 		/* Fix the relocation's type.  */
   1024          1.1     skrll 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   1025          1.1     skrll 					     R_H8_PCREL8);
   1026          1.1     skrll 		irel->r_offset--;
   1027          1.1     skrll 
   1028          1.1     skrll 		/* Delete two bytes of data.  */
   1029          1.1     skrll 		if (!elf32_h8_relax_delete_bytes (abfd, sec,
   1030          1.1     skrll 						  irel->r_offset + 1, 2))
   1031          1.1     skrll 		  goto error_return;
   1032          1.1     skrll 
   1033          1.1     skrll 		/* That will change things, so, we should relax again.
   1034      1.1.1.9  christos 		   Note that this is not required, and it may be slow.  */
   1035          1.1     skrll 		*again = true;
   1036          1.1     skrll 	      }
   1037          1.1     skrll 	    break;
   1038          1.1     skrll 	  }
   1039      1.1.1.4  christos 
   1040      1.1.1.4  christos 	  /* This is a 16-bit absolute address in one of the following
   1041          1.1     skrll 	     instructions:
   1042          1.1     skrll 
   1043          1.1     skrll 	     "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
   1044          1.1     skrll 	     "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
   1045          1.1     skrll 	     "mov.b"
   1046      1.1.1.4  christos 
   1047      1.1.1.4  christos 	     We may relax this into an 8-bit absolute address if it's in
   1048          1.1     skrll 	     the right range.  */
   1049          1.1     skrll 	case R_H8_DIR16A8:
   1050          1.1     skrll 	  {
   1051          1.1     skrll 	    bfd_vma value;
   1052          1.1     skrll 
   1053          1.1     skrll 	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
   1054          1.1     skrll 	    if (value >= 0xffffff00u)
   1055          1.1     skrll 	      {
   1056          1.1     skrll 		unsigned char code;
   1057          1.1     skrll 		unsigned char temp_code;
   1058          1.1     skrll 
   1059          1.1     skrll 		/* Note that we've changed the relocs, section contents,
   1060          1.1     skrll 		   etc.  */
   1061          1.1     skrll 		elf_section_data (sec)->relocs = internal_relocs;
   1062          1.1     skrll 		elf_section_data (sec)->this_hdr.contents = contents;
   1063          1.1     skrll 		symtab_hdr->contents = (unsigned char *) isymbuf;
   1064          1.1     skrll 
   1065          1.1     skrll 		/* Get the opcode.  */
   1066          1.1     skrll 		code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
   1067          1.1     skrll 
   1068          1.1     skrll 		/* All instructions with R_H8_DIR16A8 start with
   1069          1.1     skrll 		   0x6a.  */
   1070          1.1     skrll 		if (code != 0x6a)
   1071          1.1     skrll 		  abort ();
   1072          1.1     skrll 
   1073          1.1     skrll 		temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
   1074          1.1     skrll 		/* If this is a mov.b instruction, clear the lower
   1075          1.1     skrll 		   nibble, which contains the source/destination
   1076          1.1     skrll 		   register number.  */
   1077          1.1     skrll 		if ((temp_code & 0x10) != 0x10)
   1078          1.1     skrll 		  temp_code &= 0xf0;
   1079          1.1     skrll 
   1080          1.1     skrll 		switch (temp_code)
   1081          1.1     skrll 		  {
   1082          1.1     skrll 		  case 0x00:
   1083          1.1     skrll 		    /* This is mov.b @aa:16,Rd.  */
   1084          1.1     skrll 		    bfd_put_8 (abfd, (code & 0xf) | 0x20,
   1085          1.1     skrll 			       contents + irel->r_offset - 2);
   1086          1.1     skrll 		    break;
   1087          1.1     skrll 		  case 0x80:
   1088          1.1     skrll 		    /* This is mov.b Rs,@aa:16.  */
   1089          1.1     skrll 		    bfd_put_8 (abfd, (code & 0xf) | 0x30,
   1090          1.1     skrll 			       contents + irel->r_offset - 2);
   1091          1.1     skrll 		    break;
   1092          1.1     skrll 		  case 0x18:
   1093          1.1     skrll 		    /* This is a bit-maniputation instruction that
   1094          1.1     skrll 		       stores one bit into memory, one of "bclr",
   1095          1.1     skrll 		       "bist", "bnot", "bset", and "bst".  */
   1096          1.1     skrll 		    bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
   1097          1.1     skrll 		    break;
   1098          1.1     skrll 		  case 0x10:
   1099          1.1     skrll 		    /* This is a bit-maniputation instruction that
   1100          1.1     skrll 		       loads one bit from memory, one of "band",
   1101          1.1     skrll 		       "biand", "bild", "bior", "bixor", "bld", "bor",
   1102          1.1     skrll 		       "btst", and "bxor".  */
   1103          1.1     skrll 		    bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
   1104          1.1     skrll 		    break;
   1105          1.1     skrll 		  default:
   1106          1.1     skrll 		    abort ();
   1107          1.1     skrll 		  }
   1108          1.1     skrll 
   1109          1.1     skrll 		/* Fix the relocation's type.  */
   1110          1.1     skrll 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   1111          1.1     skrll 					     R_H8_DIR8);
   1112          1.1     skrll 
   1113          1.1     skrll 		/* Move the relocation.  */
   1114          1.1     skrll 		irel->r_offset--;
   1115          1.1     skrll 
   1116          1.1     skrll 		/* Delete two bytes of data.  */
   1117          1.1     skrll 		if (!elf32_h8_relax_delete_bytes (abfd, sec,
   1118          1.1     skrll 						  irel->r_offset + 1, 2))
   1119          1.1     skrll 		  goto error_return;
   1120          1.1     skrll 
   1121          1.1     skrll 		/* That will change things, so, we should relax again.
   1122      1.1.1.9  christos 		   Note that this is not required, and it may be slow.  */
   1123          1.1     skrll 		*again = true;
   1124          1.1     skrll 	      }
   1125          1.1     skrll 	    break;
   1126          1.1     skrll 	  }
   1127      1.1.1.4  christos 
   1128      1.1.1.4  christos 	  /* This is a 24-bit absolute address in one of the following
   1129          1.1     skrll 	     instructions:
   1130          1.1     skrll 
   1131          1.1     skrll 	     "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
   1132          1.1     skrll 	     "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
   1133          1.1     skrll 	     "mov.b"
   1134      1.1.1.4  christos 
   1135      1.1.1.4  christos 	     We may relax this into an 8-bit absolute address if it's in
   1136          1.1     skrll 	     the right range.  */
   1137          1.1     skrll 	case R_H8_DIR24A8:
   1138          1.1     skrll 	  {
   1139          1.1     skrll 	    bfd_vma value;
   1140          1.1     skrll 
   1141          1.1     skrll 	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
   1142          1.1     skrll 	    if (value >= 0xffffff00u)
   1143          1.1     skrll 	      {
   1144          1.1     skrll 		unsigned char code;
   1145          1.1     skrll 		unsigned char temp_code;
   1146          1.1     skrll 
   1147          1.1     skrll 		/* Note that we've changed the relocs, section contents,
   1148          1.1     skrll 		   etc.  */
   1149          1.1     skrll 		elf_section_data (sec)->relocs = internal_relocs;
   1150          1.1     skrll 		elf_section_data (sec)->this_hdr.contents = contents;
   1151          1.1     skrll 		symtab_hdr->contents = (unsigned char *) isymbuf;
   1152          1.1     skrll 
   1153          1.1     skrll 		/* Get the opcode.  */
   1154          1.1     skrll 		code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
   1155          1.1     skrll 
   1156          1.1     skrll 		/* All instructions with R_H8_DIR24A8 start with
   1157          1.1     skrll 		   0x6a.  */
   1158          1.1     skrll 		if (code != 0x6a)
   1159          1.1     skrll 		  abort ();
   1160          1.1     skrll 
   1161          1.1     skrll 		temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
   1162          1.1     skrll 
   1163          1.1     skrll 		/* If this is a mov.b instruction, clear the lower
   1164          1.1     skrll 		   nibble, which contains the source/destination
   1165          1.1     skrll 		   register number.  */
   1166          1.1     skrll 		if ((temp_code & 0x30) != 0x30)
   1167          1.1     skrll 		  temp_code &= 0xf0;
   1168          1.1     skrll 
   1169          1.1     skrll 		switch (temp_code)
   1170          1.1     skrll 		  {
   1171          1.1     skrll 		  case 0x20:
   1172          1.1     skrll 		    /* This is mov.b @aa:24/32,Rd.  */
   1173          1.1     skrll 		    bfd_put_8 (abfd, (code & 0xf) | 0x20,
   1174          1.1     skrll 			       contents + irel->r_offset - 2);
   1175          1.1     skrll 		    break;
   1176          1.1     skrll 		  case 0xa0:
   1177          1.1     skrll 		    /* This is mov.b Rs,@aa:24/32.  */
   1178          1.1     skrll 		    bfd_put_8 (abfd, (code & 0xf) | 0x30,
   1179          1.1     skrll 			       contents + irel->r_offset - 2);
   1180          1.1     skrll 		    break;
   1181          1.1     skrll 		  case 0x38:
   1182          1.1     skrll 		    /* This is a bit-maniputation instruction that
   1183          1.1     skrll 		       stores one bit into memory, one of "bclr",
   1184          1.1     skrll 		       "bist", "bnot", "bset", and "bst".  */
   1185          1.1     skrll 		    bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
   1186          1.1     skrll 		    break;
   1187          1.1     skrll 		  case 0x30:
   1188          1.1     skrll 		    /* This is a bit-maniputation instruction that
   1189          1.1     skrll 		       loads one bit from memory, one of "band",
   1190          1.1     skrll 		       "biand", "bild", "bior", "bixor", "bld", "bor",
   1191          1.1     skrll 		       "btst", and "bxor".  */
   1192          1.1     skrll 		    bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
   1193          1.1     skrll 		    break;
   1194          1.1     skrll 		  default:
   1195          1.1     skrll 		    abort();
   1196          1.1     skrll 		  }
   1197          1.1     skrll 
   1198          1.1     skrll 		/* Fix the relocation's type.  */
   1199          1.1     skrll 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   1200          1.1     skrll 					     R_H8_DIR8);
   1201          1.1     skrll 		irel->r_offset--;
   1202      1.1.1.4  christos 
   1203          1.1     skrll 		/* Delete four bytes of data.  */
   1204          1.1     skrll 		if (!elf32_h8_relax_delete_bytes (abfd, sec,
   1205          1.1     skrll 						  irel->r_offset + 1, 4))
   1206          1.1     skrll 		  goto error_return;
   1207          1.1     skrll 
   1208          1.1     skrll 		/* That will change things, so, we should relax again.
   1209      1.1.1.9  christos 		   Note that this is not required, and it may be slow.  */
   1210          1.1     skrll 		*again = true;
   1211          1.1     skrll 		break;
   1212          1.1     skrll 	      }
   1213          1.1     skrll 	  }
   1214          1.1     skrll 
   1215          1.1     skrll 	  /* Fall through.  */
   1216          1.1     skrll 
   1217          1.1     skrll 	  /* This is a 24-/32-bit absolute address in one of the
   1218          1.1     skrll 	     following instructions:
   1219      1.1.1.4  christos 
   1220      1.1.1.4  christos 	     "band", "bclr", "biand", "bild", "bior", "bist",
   1221      1.1.1.4  christos 	     "bixor", "bld", "bnot", "bor", "bset", "bst", "btst",
   1222          1.1     skrll 	     "bxor", "ldc.w", "stc.w" and "mov.[bwl]"
   1223          1.1     skrll 
   1224          1.1     skrll 	     We may relax this into an 16-bit absolute address if it's
   1225          1.1     skrll 	     in the right range.  */
   1226          1.1     skrll 	case R_H8_DIR32A16:
   1227          1.1     skrll 	  {
   1228          1.1     skrll 	    bfd_vma value;
   1229          1.1     skrll 
   1230          1.1     skrll 	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
   1231          1.1     skrll 	    if (value <= 0x7fff || value >= 0xffff8000u)
   1232          1.1     skrll 	      {
   1233      1.1.1.2  christos 		unsigned char code;
   1234      1.1.1.2  christos 		unsigned char op0, op1, op2, op3;
   1235          1.1     skrll 		unsigned char *op_ptr;
   1236          1.1     skrll 
   1237          1.1     skrll 		/* Note that we've changed the relocs, section contents,
   1238          1.1     skrll 		   etc.  */
   1239          1.1     skrll 		elf_section_data (sec)->relocs = internal_relocs;
   1240          1.1     skrll 		elf_section_data (sec)->this_hdr.contents = contents;
   1241          1.1     skrll 		symtab_hdr->contents = (unsigned char *) isymbuf;
   1242      1.1.1.2  christos 
   1243      1.1.1.2  christos 		if (irel->r_offset >= 4)
   1244      1.1.1.4  christos 		  {
   1245      1.1.1.2  christos 		    /* Check for 4-byte MOVA relaxation (SH-specific).  */
   1246      1.1.1.2  christos 		    int second_reloc = 0;
   1247      1.1.1.2  christos 
   1248      1.1.1.2  christos 		    op_ptr = contents + irel->r_offset - 4;
   1249      1.1.1.2  christos 
   1250      1.1.1.2  christos 		    if (last_reloc)
   1251      1.1.1.2  christos 		      {
   1252      1.1.1.2  christos 			arelent bfd_reloc;
   1253      1.1.1.2  christos 			reloc_howto_type *h;
   1254      1.1.1.2  christos 			bfd_vma last_reloc_size;
   1255      1.1.1.7  christos 
   1256      1.1.1.7  christos 			if (! elf32_h8_info_to_howto (abfd, &bfd_reloc, last_reloc))
   1257      1.1.1.2  christos 			  break;
   1258      1.1.1.2  christos 			h = bfd_reloc.howto;
   1259      1.1.1.2  christos 			last_reloc_size = 1 << h->size;
   1260      1.1.1.2  christos 			if (last_reloc->r_offset + last_reloc_size
   1261      1.1.1.2  christos 			    == irel->r_offset)
   1262      1.1.1.2  christos 			  {
   1263      1.1.1.2  christos 			    op_ptr -= last_reloc_size;
   1264      1.1.1.2  christos 			    second_reloc = 1;
   1265      1.1.1.2  christos 			  }
   1266      1.1.1.4  christos 		      }
   1267      1.1.1.4  christos 
   1268      1.1.1.2  christos 		    if (irel + 1 < irelend)
   1269      1.1.1.2  christos 		      {
   1270      1.1.1.2  christos 			Elf_Internal_Rela *next_reloc = irel + 1;
   1271      1.1.1.2  christos 			arelent bfd_reloc;
   1272      1.1.1.2  christos 			reloc_howto_type *h;
   1273      1.1.1.2  christos 			bfd_vma next_reloc_size;
   1274      1.1.1.7  christos 
   1275      1.1.1.7  christos 			if (! elf32_h8_info_to_howto (abfd, &bfd_reloc, next_reloc))
   1276      1.1.1.2  christos 			  break;
   1277      1.1.1.2  christos 			h = bfd_reloc.howto;
   1278      1.1.1.2  christos 			next_reloc_size = 1 << h->size;
   1279      1.1.1.2  christos 			if (next_reloc->r_offset + next_reloc_size
   1280      1.1.1.2  christos 			    == irel->r_offset)
   1281      1.1.1.2  christos 			  {
   1282      1.1.1.2  christos 			    op_ptr -= next_reloc_size;
   1283      1.1.1.2  christos 			    second_reloc = 1;
   1284      1.1.1.2  christos 			  }
   1285      1.1.1.2  christos 		      }
   1286      1.1.1.2  christos 
   1287      1.1.1.2  christos 		    op0 = bfd_get_8 (abfd, op_ptr + 0);
   1288      1.1.1.2  christos 		    op1 = bfd_get_8 (abfd, op_ptr + 1);
   1289      1.1.1.2  christos 		    op2 = bfd_get_8 (abfd, op_ptr + 2);
   1290      1.1.1.2  christos 		    op3 = bfd_get_8 (abfd, op_ptr + 3);
   1291      1.1.1.2  christos 
   1292      1.1.1.2  christos 		    if (op0 == 0x01
   1293      1.1.1.2  christos 			&& (op1 & 0xdf) == 0x5f
   1294      1.1.1.2  christos 			&& (op2 & 0x40) == 0x40
   1295      1.1.1.2  christos 			&& (op3 & 0x80) == 0x80)
   1296      1.1.1.2  christos 		      {
   1297      1.1.1.2  christos 			if ((op2 & 0x08) == 0)
   1298      1.1.1.2  christos 			  second_reloc = 1;
   1299      1.1.1.2  christos 
   1300      1.1.1.2  christos 			if (second_reloc)
   1301      1.1.1.2  christos 			  {
   1302      1.1.1.2  christos 			    op3 &= ~0x08;
   1303      1.1.1.2  christos 			    bfd_put_8 (abfd, op3, op_ptr + 3);
   1304      1.1.1.2  christos 			  }
   1305      1.1.1.2  christos 			else
   1306      1.1.1.2  christos 			  {
   1307      1.1.1.2  christos 			    op2 &= ~0x08;
   1308      1.1.1.2  christos 			    bfd_put_8 (abfd, op2, op_ptr + 2);
   1309      1.1.1.2  christos 			  }
   1310      1.1.1.2  christos 			goto r_h8_dir32a16_common;
   1311      1.1.1.2  christos 		      }
   1312      1.1.1.2  christos 		  }
   1313      1.1.1.4  christos 
   1314      1.1.1.2  christos 		/* Now check for short version of MOVA.  (SH-specific) */
   1315      1.1.1.2  christos 		op_ptr = contents + irel->r_offset - 2;
   1316      1.1.1.2  christos 		op0 = bfd_get_8 (abfd, op_ptr + 0);
   1317      1.1.1.2  christos 		op1 = bfd_get_8 (abfd, op_ptr + 1);
   1318      1.1.1.2  christos 
   1319      1.1.1.2  christos 		if (op0 == 0x7a
   1320      1.1.1.2  christos 		    && (op1 & 0x88) == 0x80)
   1321      1.1.1.2  christos 		  {
   1322      1.1.1.2  christos 		    op1 |= 0x08;
   1323      1.1.1.2  christos 		    bfd_put_8 (abfd, op1, op_ptr + 1);
   1324      1.1.1.2  christos 		    goto r_h8_dir32a16_common;
   1325      1.1.1.2  christos 		  }
   1326          1.1     skrll 
   1327          1.1     skrll 		/* Get the opcode.  */
   1328          1.1     skrll 		code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
   1329          1.1     skrll 
   1330          1.1     skrll 		/* Fix the opcode.  For all the instructions that
   1331          1.1     skrll 		   belong to this relaxation, we simply need to turn
   1332          1.1     skrll 		   off bit 0x20 in the previous byte.  */
   1333          1.1     skrll 		code &= ~0x20;
   1334          1.1     skrll 
   1335          1.1     skrll 		bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
   1336      1.1.1.2  christos 
   1337          1.1     skrll 	      r_h8_dir32a16_common:
   1338          1.1     skrll 		/* Fix the relocation's type.  */
   1339          1.1     skrll 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   1340          1.1     skrll 					     R_H8_DIR16);
   1341          1.1     skrll 
   1342          1.1     skrll 		/* Delete two bytes of data.  */
   1343          1.1     skrll 		if (!elf32_h8_relax_delete_bytes (abfd, sec,
   1344          1.1     skrll 						  irel->r_offset + 1, 2))
   1345          1.1     skrll 		  goto error_return;
   1346          1.1     skrll 
   1347          1.1     skrll 		/* That will change things, so, we should relax again.
   1348      1.1.1.9  christos 		   Note that this is not required, and it may be slow.  */
   1349          1.1     skrll 		*again = true;
   1350      1.1.1.4  christos 	      }
   1351      1.1.1.4  christos 	    break;	/* case R_H8_DIR32A16 */
   1352      1.1.1.4  christos 	  }
   1353      1.1.1.4  christos 
   1354      1.1.1.4  christos 	case R_H8_DISP32A16:
   1355      1.1.1.4  christos 	  /* mov.[bwl] @(displ:24/32+ERx) -> mov.[bwl] @(displ:16+ERx)  4 bytes
   1356      1.1.1.4  christos 	     It is assured that instruction uses at least 4 bytes opcode before
   1357      1.1.1.4  christos 	     reloc entry addressing mode "register indirect with displacement"
   1358      1.1.1.4  christos 	     relaxing options (all saving 4 bytes):
   1359      1.1.1.4  christos 	     0x78 0sss0000 0x6A 0010dddd disp:32  mov.b @(d:32,ERs),Rd  ->
   1360      1.1.1.4  christos 	     0x6E 0sssdddd disp:16  mov.b @(d:16,ERs),Rd
   1361      1.1.1.4  christos 	     0x78 0sss0000 0x6B 0010dddd disp:32  mov.w @(d:32,ERs),Rd  ->
   1362      1.1.1.4  christos 	     0x6F 0sssdddd disp:16  mov.w @(d:16,ERs),Rd
   1363      1.1.1.4  christos 	     0x01 0x00 0x78 0sss0000 0x6B 00100ddd disp:32  mov.l @(d:32,ERs),ERd ->
   1364      1.1.1.4  christos 	     0x01 0x00 0x6F 0sss0ddd disp:16  mov.l @(d:16,ERs),ERd
   1365      1.1.1.4  christos 
   1366      1.1.1.4  christos 	     0x78 0ddd0000 0x6A 1010ssss disp:32  mov.b Rs,@(d:32,ERd)  ->
   1367      1.1.1.4  christos 	     0x6E 1dddssss disp:16  mov.b Rs,@(d:16,ERd)
   1368      1.1.1.4  christos 	     0x78 0ddd0000 0x6B 1010ssss disp:32  mov.w Rs,@(d:32,ERd)  ->
   1369      1.1.1.4  christos 	     0x6F 1dddssss disp:16  mov.w Rs,@(d:16,ERd)
   1370      1.1.1.4  christos 	     0x01 0x00 0x78 xddd0000 0x6B 10100sss disp:32  mov.l ERs,@(d:32,ERd) ->
   1371      1.1.1.4  christos 	     0x01 0x00 0x6F 1ddd0sss disp:16  mov.l ERs,@(d:16,ERd)
   1372      1.1.1.4  christos 	     mov.l prefix 0x01 0x00 can be left as is and mov.l handled same
   1373      1.1.1.4  christos 	     as mov.w/  */
   1374      1.1.1.4  christos 	  {
   1375      1.1.1.4  christos 	    bfd_vma value;
   1376      1.1.1.4  christos 
   1377      1.1.1.4  christos 	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
   1378      1.1.1.4  christos 	    if (value <= 0x7fff || value >= 0xffff8000u)
   1379      1.1.1.4  christos 	      {
   1380      1.1.1.4  christos 		unsigned char op0, op1, op2, op3, op0n, op1n;
   1381      1.1.1.4  christos 		int relax = 0;
   1382      1.1.1.4  christos 
   1383      1.1.1.4  christos 		/* Note that we've changed the relocs, section contents,
   1384      1.1.1.4  christos 		   etc.  */
   1385      1.1.1.4  christos 		elf_section_data (sec)->relocs = internal_relocs;
   1386      1.1.1.4  christos 		elf_section_data (sec)->this_hdr.contents = contents;
   1387      1.1.1.4  christos 		symtab_hdr->contents = (unsigned char *) isymbuf;
   1388      1.1.1.4  christos 
   1389      1.1.1.4  christos 		if (irel->r_offset >= 4)
   1390      1.1.1.4  christos 		  {
   1391      1.1.1.4  christos 		    op0 = bfd_get_8 (abfd, contents + irel->r_offset - 4);
   1392      1.1.1.4  christos 		    op1 = bfd_get_8 (abfd, contents + irel->r_offset - 3);
   1393      1.1.1.4  christos 		    op2 = bfd_get_8 (abfd, contents + irel->r_offset - 2);
   1394      1.1.1.4  christos 		    op3 = bfd_get_8 (abfd, contents + irel->r_offset - 1);
   1395      1.1.1.4  christos 
   1396      1.1.1.4  christos 		    if (op0 == 0x78)
   1397      1.1.1.4  christos 		      {
   1398      1.1.1.4  christos 			switch(op2)
   1399      1.1.1.4  christos 			  {
   1400      1.1.1.4  christos 			  case 0x6A:
   1401      1.1.1.4  christos 			    if ((op1 & 0x8F) == 0x00 && (op3 & 0x70) == 0x20)
   1402      1.1.1.4  christos 			      {
   1403      1.1.1.4  christos 				/* mov.b.  */
   1404      1.1.1.4  christos 				op0n = 0x6E;
   1405      1.1.1.4  christos 				relax = 1;
   1406      1.1.1.4  christos 			      }
   1407      1.1.1.4  christos 			    break;
   1408      1.1.1.4  christos 			  case 0x6B:
   1409      1.1.1.4  christos 			    if ((op1 & 0x0F) == 0x00 && (op3 & 0x70) == 0x20)
   1410      1.1.1.4  christos 			      {
   1411      1.1.1.4  christos 				/* mov.w/l.  */
   1412      1.1.1.4  christos 				op0n = 0x6F;
   1413      1.1.1.4  christos 				relax = 1;
   1414      1.1.1.4  christos 			      }
   1415      1.1.1.4  christos 			    break;
   1416      1.1.1.4  christos 			  default:
   1417      1.1.1.4  christos 			    break;
   1418      1.1.1.4  christos 			  }
   1419      1.1.1.4  christos 		      }
   1420      1.1.1.4  christos 		  }
   1421      1.1.1.4  christos 
   1422      1.1.1.4  christos 		if (relax)
   1423      1.1.1.4  christos 		  {
   1424      1.1.1.4  christos 		    op1n = (op3 & 0x8F) | (op1 & 0x70);
   1425      1.1.1.4  christos 		    bfd_put_8 (abfd, op0n, contents + irel->r_offset - 4);
   1426      1.1.1.4  christos 		    bfd_put_8 (abfd, op1n, contents + irel->r_offset - 3);
   1427      1.1.1.4  christos 
   1428      1.1.1.4  christos 		    /* Fix the relocation's type.  */
   1429      1.1.1.4  christos 		    irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_H8_DIR16);
   1430      1.1.1.4  christos 		    irel->r_offset -= 2;
   1431      1.1.1.4  christos 
   1432      1.1.1.4  christos 		    /* Delete four bytes of data.  */
   1433      1.1.1.4  christos 		    if (!elf32_h8_relax_delete_bytes (abfd, sec, irel->r_offset + 2, 4))
   1434      1.1.1.4  christos 		      goto error_return;
   1435      1.1.1.4  christos 
   1436      1.1.1.4  christos 		    /* That will change things, so, we should relax again.
   1437      1.1.1.9  christos 		       Note that this is not required, and it may be slow.  */
   1438      1.1.1.4  christos 		    *again = true;
   1439      1.1.1.4  christos 		  }
   1440          1.1     skrll 	      }
   1441      1.1.1.4  christos 	  }
   1442          1.1     skrll 	  break;
   1443          1.1     skrll 
   1444          1.1     skrll 	default:
   1445          1.1     skrll 	  break;
   1446          1.1     skrll 	}
   1447          1.1     skrll     }
   1448          1.1     skrll 
   1449          1.1     skrll   if (isymbuf != NULL
   1450          1.1     skrll       && symtab_hdr->contents != (unsigned char *) isymbuf)
   1451          1.1     skrll     {
   1452          1.1     skrll       if (! link_info->keep_memory)
   1453          1.1     skrll 	free (isymbuf);
   1454          1.1     skrll       else
   1455          1.1     skrll 	symtab_hdr->contents = (unsigned char *) isymbuf;
   1456          1.1     skrll     }
   1457          1.1     skrll 
   1458          1.1     skrll   if (contents != NULL
   1459          1.1     skrll       && elf_section_data (sec)->this_hdr.contents != contents)
   1460          1.1     skrll     {
   1461          1.1     skrll       if (! link_info->keep_memory)
   1462          1.1     skrll 	free (contents);
   1463          1.1     skrll       else
   1464          1.1     skrll 	{
   1465          1.1     skrll 	  /* Cache the section contents for elf_link_input_bfd.  */
   1466          1.1     skrll 	  elf_section_data (sec)->this_hdr.contents = contents;
   1467          1.1     skrll 	}
   1468          1.1     skrll     }
   1469      1.1.1.9  christos 
   1470          1.1     skrll   if (elf_section_data (sec)->relocs != internal_relocs)
   1471          1.1     skrll     free (internal_relocs);
   1472      1.1.1.9  christos 
   1473          1.1     skrll   return true;
   1474          1.1     skrll 
   1475      1.1.1.9  christos  error_return:
   1476          1.1     skrll   if (symtab_hdr->contents != (unsigned char *) isymbuf)
   1477      1.1.1.9  christos     free (isymbuf);
   1478          1.1     skrll   if (elf_section_data (sec)->this_hdr.contents != contents)
   1479      1.1.1.9  christos     free (contents);
   1480          1.1     skrll   if (elf_section_data (sec)->relocs != internal_relocs)
   1481      1.1.1.9  christos     free (internal_relocs);
   1482          1.1     skrll   return false;
   1483          1.1     skrll }
   1484          1.1     skrll 
   1485          1.1     skrll /* Delete some bytes from a section while relaxing.  */
   1486      1.1.1.9  christos 
   1487          1.1     skrll static bool
   1488          1.1     skrll elf32_h8_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count)
   1489          1.1     skrll {
   1490          1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
   1491          1.1     skrll   unsigned int sec_shndx;
   1492          1.1     skrll   bfd_byte *contents;
   1493          1.1     skrll   Elf_Internal_Rela *irel, *irelend;
   1494          1.1     skrll   Elf_Internal_Sym *isym;
   1495          1.1     skrll   Elf_Internal_Sym *isymend;
   1496          1.1     skrll   bfd_vma toaddr;
   1497          1.1     skrll   struct elf_link_hash_entry **sym_hashes;
   1498          1.1     skrll   struct elf_link_hash_entry **end_hashes;
   1499          1.1     skrll   unsigned int symcount;
   1500          1.1     skrll 
   1501          1.1     skrll   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
   1502          1.1     skrll 
   1503          1.1     skrll   contents = elf_section_data (sec)->this_hdr.contents;
   1504          1.1     skrll 
   1505          1.1     skrll   toaddr = sec->size;
   1506          1.1     skrll 
   1507          1.1     skrll   irel = elf_section_data (sec)->relocs;
   1508          1.1     skrll   irelend = irel + sec->reloc_count;
   1509          1.1     skrll 
   1510          1.1     skrll   /* Actually delete the bytes.  */
   1511          1.1     skrll   memmove (contents + addr, contents + addr + count,
   1512          1.1     skrll 	   (size_t) (toaddr - addr - count));
   1513          1.1     skrll   sec->size -= count;
   1514          1.1     skrll 
   1515          1.1     skrll   /* Adjust all the relocs.  */
   1516          1.1     skrll   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
   1517          1.1     skrll     {
   1518          1.1     skrll       /* Get the new reloc address.  */
   1519      1.1.1.4  christos       if ((irel->r_offset > addr
   1520          1.1     skrll 	   && irel->r_offset <= toaddr))
   1521          1.1     skrll 	irel->r_offset -= count;
   1522          1.1     skrll     }
   1523          1.1     skrll 
   1524          1.1     skrll   /* Adjust the local symbols defined in this section.  */
   1525          1.1     skrll   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1526          1.1     skrll   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
   1527          1.1     skrll   isymend = isym + symtab_hdr->sh_info;
   1528          1.1     skrll   for (; isym < isymend; isym++)
   1529          1.1     skrll     {
   1530          1.1     skrll       if (isym->st_shndx == sec_shndx
   1531      1.1.1.4  christos 	  && isym->st_value > addr
   1532          1.1     skrll 	  && isym->st_value <= toaddr)
   1533          1.1     skrll 	isym->st_value -= count;
   1534          1.1     skrll     }
   1535          1.1     skrll 
   1536          1.1     skrll   /* Now adjust the global symbols defined in this section.  */
   1537          1.1     skrll   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
   1538          1.1     skrll 	      - symtab_hdr->sh_info);
   1539          1.1     skrll   sym_hashes = elf_sym_hashes (abfd);
   1540          1.1     skrll   end_hashes = sym_hashes + symcount;
   1541          1.1     skrll   for (; sym_hashes < end_hashes; sym_hashes++)
   1542          1.1     skrll     {
   1543      1.1.1.4  christos       struct elf_link_hash_entry *sym_hash = *sym_hashes;
   1544          1.1     skrll 
   1545          1.1     skrll       if ((sym_hash->root.type == bfd_link_hash_defined
   1546          1.1     skrll 	   || sym_hash->root.type == bfd_link_hash_defweak)
   1547          1.1     skrll 	  && sym_hash->root.u.def.section == sec
   1548      1.1.1.4  christos 	  && sym_hash->root.u.def.value > addr
   1549      1.1.1.4  christos 	  && sym_hash->root.u.def.value <= toaddr)
   1550          1.1     skrll 	sym_hash->root.u.def.value -= count;
   1551          1.1     skrll     }
   1552      1.1.1.9  christos 
   1553          1.1     skrll   return true;
   1554          1.1     skrll }
   1555          1.1     skrll 
   1556          1.1     skrll /* Return TRUE if a symbol exists at the given address, else return
   1557      1.1.1.9  christos    FALSE.  */
   1558          1.1     skrll static bool
   1559          1.1     skrll elf32_h8_symbol_address_p (bfd *abfd, asection *sec, bfd_vma addr)
   1560          1.1     skrll {
   1561          1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
   1562          1.1     skrll   unsigned int sec_shndx;
   1563          1.1     skrll   Elf_Internal_Sym *isym;
   1564          1.1     skrll   Elf_Internal_Sym *isymend;
   1565          1.1     skrll   struct elf_link_hash_entry **sym_hashes;
   1566          1.1     skrll   struct elf_link_hash_entry **end_hashes;
   1567          1.1     skrll   unsigned int symcount;
   1568          1.1     skrll 
   1569          1.1     skrll   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
   1570          1.1     skrll 
   1571          1.1     skrll   /* Examine all the symbols.  */
   1572          1.1     skrll   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1573          1.1     skrll   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
   1574          1.1     skrll   isymend = isym + symtab_hdr->sh_info;
   1575          1.1     skrll   for (; isym < isymend; isym++)
   1576          1.1     skrll     {
   1577          1.1     skrll       if (isym->st_shndx == sec_shndx
   1578      1.1.1.9  christos 	  && isym->st_value == addr)
   1579          1.1     skrll 	return true;
   1580          1.1     skrll     }
   1581          1.1     skrll 
   1582          1.1     skrll   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
   1583          1.1     skrll 	      - symtab_hdr->sh_info);
   1584          1.1     skrll   sym_hashes = elf_sym_hashes (abfd);
   1585          1.1     skrll   end_hashes = sym_hashes + symcount;
   1586          1.1     skrll   for (; sym_hashes < end_hashes; sym_hashes++)
   1587          1.1     skrll     {
   1588          1.1     skrll       struct elf_link_hash_entry *sym_hash = *sym_hashes;
   1589          1.1     skrll       if ((sym_hash->root.type == bfd_link_hash_defined
   1590          1.1     skrll 	   || sym_hash->root.type == bfd_link_hash_defweak)
   1591          1.1     skrll 	  && sym_hash->root.u.def.section == sec
   1592      1.1.1.9  christos 	  && sym_hash->root.u.def.value == addr)
   1593          1.1     skrll 	return true;
   1594          1.1     skrll     }
   1595      1.1.1.9  christos 
   1596          1.1     skrll   return false;
   1597          1.1     skrll }
   1598          1.1     skrll 
   1599          1.1     skrll /* This is a version of bfd_generic_get_relocated_section_contents
   1600          1.1     skrll    which uses elf32_h8_relocate_section.  */
   1601          1.1     skrll 
   1602          1.1     skrll static bfd_byte *
   1603          1.1     skrll elf32_h8_get_relocated_section_contents (bfd *output_bfd,
   1604          1.1     skrll 					 struct bfd_link_info *link_info,
   1605          1.1     skrll 					 struct bfd_link_order *link_order,
   1606      1.1.1.9  christos 					 bfd_byte *data,
   1607          1.1     skrll 					 bool relocatable,
   1608          1.1     skrll 					 asymbol **symbols)
   1609          1.1     skrll {
   1610          1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
   1611          1.1     skrll   asection *input_section = link_order->u.indirect.section;
   1612          1.1     skrll   bfd *input_bfd = input_section->owner;
   1613          1.1     skrll   asection **sections = NULL;
   1614          1.1     skrll   Elf_Internal_Rela *internal_relocs = NULL;
   1615          1.1     skrll   Elf_Internal_Sym *isymbuf = NULL;
   1616          1.1     skrll 
   1617          1.1     skrll   /* We only need to handle the case of relaxing, or of having a
   1618          1.1     skrll      particular set of section contents, specially.  */
   1619          1.1     skrll   if (relocatable
   1620          1.1     skrll       || elf_section_data (input_section)->this_hdr.contents == NULL)
   1621          1.1     skrll     return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
   1622          1.1     skrll 						       link_order, data,
   1623          1.1     skrll 						       relocatable,
   1624          1.1     skrll 						       symbols);
   1625          1.1     skrll 
   1626          1.1     skrll   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
   1627  1.1.1.9.2.1  perseant 
   1628  1.1.1.9.2.1  perseant   bfd_byte *orig_data = data;
   1629  1.1.1.9.2.1  perseant   if (data == NULL)
   1630  1.1.1.9.2.1  perseant     {
   1631  1.1.1.9.2.1  perseant       data = bfd_malloc (input_section->size);
   1632  1.1.1.9.2.1  perseant       if (data == NULL)
   1633  1.1.1.9.2.1  perseant 	return NULL;
   1634          1.1     skrll     }
   1635          1.1     skrll   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
   1636          1.1     skrll 	  (size_t) input_section->size);
   1637          1.1     skrll 
   1638          1.1     skrll   if ((input_section->flags & SEC_RELOC) != 0
   1639          1.1     skrll       && input_section->reloc_count > 0)
   1640          1.1     skrll     {
   1641          1.1     skrll       asection **secpp;
   1642          1.1     skrll       Elf_Internal_Sym *isym, *isymend;
   1643          1.1     skrll       bfd_size_type amt;
   1644          1.1     skrll 
   1645      1.1.1.3  christos       internal_relocs = (_bfd_elf_link_read_relocs
   1646      1.1.1.9  christos 			 (input_bfd, input_section, NULL,
   1647          1.1     skrll 			  (Elf_Internal_Rela *) NULL, false));
   1648          1.1     skrll       if (internal_relocs == NULL)
   1649          1.1     skrll 	goto error_return;
   1650          1.1     skrll 
   1651          1.1     skrll       if (symtab_hdr->sh_info != 0)
   1652          1.1     skrll 	{
   1653          1.1     skrll 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
   1654          1.1     skrll 	  if (isymbuf == NULL)
   1655          1.1     skrll 	    isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
   1656          1.1     skrll 					    symtab_hdr->sh_info, 0,
   1657          1.1     skrll 					    NULL, NULL, NULL);
   1658          1.1     skrll 	  if (isymbuf == NULL)
   1659          1.1     skrll 	    goto error_return;
   1660          1.1     skrll 	}
   1661          1.1     skrll 
   1662          1.1     skrll       amt = symtab_hdr->sh_info;
   1663          1.1     skrll       amt *= sizeof (asection *);
   1664          1.1     skrll       sections = (asection **) bfd_malloc (amt);
   1665          1.1     skrll       if (sections == NULL && amt != 0)
   1666          1.1     skrll 	goto error_return;
   1667          1.1     skrll 
   1668          1.1     skrll       isymend = isymbuf + symtab_hdr->sh_info;
   1669          1.1     skrll       for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
   1670          1.1     skrll 	{
   1671          1.1     skrll 	  asection *isec;
   1672          1.1     skrll 
   1673          1.1     skrll 	  if (isym->st_shndx == SHN_UNDEF)
   1674          1.1     skrll 	    isec = bfd_und_section_ptr;
   1675          1.1     skrll 	  else if (isym->st_shndx == SHN_ABS)
   1676          1.1     skrll 	    isec = bfd_abs_section_ptr;
   1677          1.1     skrll 	  else if (isym->st_shndx == SHN_COMMON)
   1678          1.1     skrll 	    isec = bfd_com_section_ptr;
   1679          1.1     skrll 	  else
   1680          1.1     skrll 	    isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
   1681          1.1     skrll 
   1682          1.1     skrll 	  *secpp = isec;
   1683          1.1     skrll 	}
   1684          1.1     skrll 
   1685          1.1     skrll       if (! elf32_h8_relocate_section (output_bfd, link_info, input_bfd,
   1686          1.1     skrll 				       input_section, data, internal_relocs,
   1687          1.1     skrll 				       isymbuf, sections))
   1688          1.1     skrll 	goto error_return;
   1689      1.1.1.9  christos 
   1690      1.1.1.9  christos       free (sections);
   1691          1.1     skrll       if (symtab_hdr->contents != (unsigned char *) isymbuf)
   1692          1.1     skrll 	free (isymbuf);
   1693          1.1     skrll       if (elf_section_data (input_section)->relocs != internal_relocs)
   1694          1.1     skrll 	free (internal_relocs);
   1695          1.1     skrll     }
   1696          1.1     skrll 
   1697          1.1     skrll   return data;
   1698          1.1     skrll 
   1699      1.1.1.9  christos  error_return:
   1700      1.1.1.9  christos   free (sections);
   1701          1.1     skrll   if (symtab_hdr->contents != (unsigned char *) isymbuf)
   1702      1.1.1.9  christos     free (isymbuf);
   1703          1.1     skrll   if (elf_section_data (input_section)->relocs != internal_relocs)
   1704  1.1.1.9.2.1  perseant     free (internal_relocs);
   1705  1.1.1.9.2.1  perseant   if (orig_data == NULL)
   1706          1.1     skrll     free (data);
   1707          1.1     skrll   return NULL;
   1708          1.1     skrll }
   1709          1.1     skrll 
   1710      1.1.1.4  christos 
   1711          1.1     skrll #define TARGET_BIG_SYM			h8300_elf32_vec
   1712          1.1     skrll #define TARGET_BIG_NAME			"elf32-h8300"
   1713          1.1     skrll #define ELF_ARCH			bfd_arch_h8300
   1714          1.1     skrll #define ELF_MACHINE_CODE		EM_H8_300
   1715          1.1     skrll #define ELF_MAXPAGESIZE			0x1
   1716          1.1     skrll #define bfd_elf32_bfd_reloc_type_lookup elf32_h8_reloc_type_lookup
   1717          1.1     skrll #define bfd_elf32_bfd_reloc_name_lookup elf32_h8_reloc_name_lookup
   1718          1.1     skrll #define elf_info_to_howto		elf32_h8_info_to_howto
   1719          1.1     skrll #define elf_info_to_howto_rel		elf32_h8_info_to_howto_rel
   1720          1.1     skrll 
   1721          1.1     skrll /* So we can set/examine bits in e_flags to get the specific
   1722          1.1     skrll    H8 architecture in use.  */
   1723          1.1     skrll #define elf_backend_final_write_processing \
   1724          1.1     skrll   elf32_h8_final_write_processing
   1725          1.1     skrll #define elf_backend_object_p \
   1726          1.1     skrll   elf32_h8_object_p
   1727          1.1     skrll #define bfd_elf32_bfd_merge_private_bfd_data \
   1728          1.1     skrll   elf32_h8_merge_private_bfd_data
   1729          1.1     skrll 
   1730          1.1     skrll /* ??? when elf_backend_relocate_section is not defined, elf32-target.h
   1731          1.1     skrll    defaults to using _bfd_generic_link_hash_table_create, but
   1732          1.1     skrll    bfd_elf_size_dynamic_sections uses
   1733          1.1     skrll    dynobj = elf_hash_table (info)->dynobj;
   1734          1.1     skrll    and thus requires an elf hash table.  */
   1735          1.1     skrll #define bfd_elf32_bfd_link_hash_table_create _bfd_elf_link_hash_table_create
   1736          1.1     skrll 
   1737          1.1     skrll /* Use an H8 specific linker, not the ELF generic linker.  */
   1738          1.1     skrll #define elf_backend_relocate_section elf32_h8_relocate_section
   1739          1.1     skrll #define elf_backend_rela_normal		1
   1740          1.1     skrll #define elf_backend_can_gc_sections	1
   1741          1.1     skrll 
   1742          1.1     skrll /* And relaxing stuff.  */
   1743          1.1     skrll #define bfd_elf32_bfd_relax_section     elf32_h8_relax_section
   1744      1.1.1.6  christos #define bfd_elf32_bfd_get_relocated_section_contents \
   1745          1.1     skrll 				elf32_h8_get_relocated_section_contents
   1746      1.1.1.2  christos 
   1747          1.1     skrll #define elf_symbol_leading_char '_'
   1748          1.1     skrll 
   1749      1.1.1.4  christos #include "elf32-target.h"
   1750      1.1.1.4  christos 
   1751      1.1.1.4  christos #undef  TARGET_BIG_SYM
   1752      1.1.1.4  christos #define TARGET_BIG_SYM			h8300_elf32_linux_vec
   1753      1.1.1.4  christos #undef  TARGET_BIG_NAME
   1754      1.1.1.4  christos #define TARGET_BIG_NAME			"elf32-h8300-linux"
   1755      1.1.1.4  christos #undef  elf_symbol_leading_char
   1756      1.1.1.4  christos #define elf32_bed			elf32_h8300_linux_bed
   1757      1.1.1.4  christos 
   1758                        #include "elf32-target.h"
   1759