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