Home | History | Annotate | Line # | Download | only in bfd
elf32-rl78.c revision 1.1.1.5
      1 /* Renesas RL78 specific support for 32-bit ELF.
      2    Copyright (C) 2011-2017 Free Software Foundation, Inc.
      3 
      4    This file is part of BFD, the Binary File Descriptor library.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
     19 
     20 #include "sysdep.h"
     21 #include "bfd.h"
     22 #include "bfd_stdint.h"
     23 #include "libbfd.h"
     24 #include "elf-bfd.h"
     25 #include "elf/rl78.h"
     26 #include "libiberty.h"
     27 
     28 #define valid_16bit_address(v) ((v) <= 0x0ffff || (v) >= 0xf0000)
     29 
     30 #define RL78REL(n,sz,bit,shift,complain,pcrel)				     \
     31   HOWTO (R_RL78_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
     32 	 bfd_elf_generic_reloc, "R_RL78_" #n, FALSE, 0, ~0, FALSE)
     33 
     34 static bfd_reloc_status_type rl78_special_reloc (bfd *, arelent *, asymbol *, void *,
     35 						 asection *, bfd *, char **);
     36 
     37 /* FIXME: We could omit the SHIFT parameter, it is always zero.  */
     38 #define RL78_OP_REL(n,sz,bit,shift,complain,pcrel)			\
     39   HOWTO (R_RL78_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
     40 	 rl78_special_reloc, "R_RL78_" #n, FALSE, 0, ~0, FALSE)
     41 
     42 /* Note that the relocations around 0x7f are internal to this file;
     43    feel free to move them as needed to avoid conflicts with published
     44    relocation numbers.  */
     45 
     46 static reloc_howto_type rl78_elf_howto_table [] =
     47 {
     48   RL78REL (NONE,         3,  0, 0, dont,     FALSE),
     49   RL78REL (DIR32,        2, 32, 0, signed,   FALSE),
     50   RL78REL (DIR24S,       2, 24, 0, signed,   FALSE),
     51   RL78REL (DIR16,        1, 16, 0, dont,     FALSE),
     52   RL78REL (DIR16U,       1, 16, 0, unsigned, FALSE),
     53   RL78REL (DIR16S,       1, 16, 0, signed,   FALSE),
     54   RL78REL (DIR8,         0,  8, 0, dont,     FALSE),
     55   RL78REL (DIR8U,        0,  8, 0, unsigned, FALSE),
     56   RL78REL (DIR8S,        0,  8, 0, signed,   FALSE),
     57   RL78REL (DIR24S_PCREL, 2, 24, 0, signed,   TRUE),
     58   RL78REL (DIR16S_PCREL, 1, 16, 0, signed,   TRUE),
     59   RL78REL (DIR8S_PCREL,  0,  8, 0, signed,   TRUE),
     60   RL78REL (DIR16UL,      1, 16, 2, unsigned, FALSE),
     61   RL78REL (DIR16UW,      1, 16, 1, unsigned, FALSE),
     62   RL78REL (DIR8UL,       0,  8, 2, unsigned, FALSE),
     63   RL78REL (DIR8UW,       0,  8, 1, unsigned, FALSE),
     64   RL78REL (DIR32_REV,    1, 16, 0, dont,     FALSE),
     65   RL78REL (DIR16_REV,    1, 16, 0, dont,     FALSE),
     66   RL78REL (DIR3U_PCREL,  0,  3, 0, dont,     TRUE),
     67 
     68   EMPTY_HOWTO (0x13),
     69   EMPTY_HOWTO (0x14),
     70   EMPTY_HOWTO (0x15),
     71   EMPTY_HOWTO (0x16),
     72   EMPTY_HOWTO (0x17),
     73   EMPTY_HOWTO (0x18),
     74   EMPTY_HOWTO (0x19),
     75   EMPTY_HOWTO (0x1a),
     76   EMPTY_HOWTO (0x1b),
     77   EMPTY_HOWTO (0x1c),
     78   EMPTY_HOWTO (0x1d),
     79   EMPTY_HOWTO (0x1e),
     80   EMPTY_HOWTO (0x1f),
     81 
     82   EMPTY_HOWTO (0x20),
     83   EMPTY_HOWTO (0x21),
     84   EMPTY_HOWTO (0x22),
     85   EMPTY_HOWTO (0x23),
     86   EMPTY_HOWTO (0x24),
     87   EMPTY_HOWTO (0x25),
     88   EMPTY_HOWTO (0x26),
     89   EMPTY_HOWTO (0x27),
     90   EMPTY_HOWTO (0x28),
     91   EMPTY_HOWTO (0x29),
     92   EMPTY_HOWTO (0x2a),
     93   EMPTY_HOWTO (0x2b),
     94   EMPTY_HOWTO (0x2c),
     95   RL78REL (RH_RELAX, 0,  0, 0, dont,     FALSE),
     96 
     97   EMPTY_HOWTO (0x2e),
     98   RL78REL (RH_SADDR, 0,  0, 0, dont,     FALSE),
     99   EMPTY_HOWTO (0x30),
    100   EMPTY_HOWTO (0x31),
    101   EMPTY_HOWTO (0x32),
    102   EMPTY_HOWTO (0x33),
    103   EMPTY_HOWTO (0x34),
    104   EMPTY_HOWTO (0x35),
    105   EMPTY_HOWTO (0x36),
    106   EMPTY_HOWTO (0x37),
    107   EMPTY_HOWTO (0x38),
    108   EMPTY_HOWTO (0x39),
    109   EMPTY_HOWTO (0x3a),
    110   EMPTY_HOWTO (0x3b),
    111   EMPTY_HOWTO (0x3c),
    112   EMPTY_HOWTO (0x3d),
    113   EMPTY_HOWTO (0x3e),
    114   EMPTY_HOWTO (0x3f),
    115   EMPTY_HOWTO (0x40),
    116 
    117   RL78_OP_REL (ABS32,        2, 32, 0, dont,     FALSE),
    118   RL78_OP_REL (ABS24S,       2, 24, 0, signed,   FALSE),
    119   RL78_OP_REL (ABS16,        1, 16, 0, dont,     FALSE),
    120   RL78_OP_REL (ABS16U,       1, 16, 0, unsigned, FALSE),
    121   RL78_OP_REL (ABS16S,       1, 16, 0, signed,   FALSE),
    122   RL78_OP_REL (ABS8,         0,  8, 0, dont,     FALSE),
    123   RL78_OP_REL (ABS8U,        0,  8, 0, unsigned, FALSE),
    124   RL78_OP_REL (ABS8S,        0,  8, 0, signed,   FALSE),
    125   RL78_OP_REL (ABS24S_PCREL, 2, 24, 0, signed,   TRUE),
    126   RL78_OP_REL (ABS16S_PCREL, 1, 16, 0, signed,   TRUE),
    127   RL78_OP_REL (ABS8S_PCREL,  0,  8, 0, signed,   TRUE),
    128   RL78_OP_REL (ABS16UL,      1, 16, 0, unsigned, FALSE),
    129   RL78_OP_REL (ABS16UW,      1, 16, 0, unsigned, FALSE),
    130   RL78_OP_REL (ABS8UL,       0,  8, 0, unsigned, FALSE),
    131   RL78_OP_REL (ABS8UW,       0,  8, 0, unsigned, FALSE),
    132   RL78_OP_REL (ABS32_REV,    2, 32, 0, dont,     FALSE),
    133   RL78_OP_REL (ABS16_REV,    1, 16, 0, dont,     FALSE),
    134 
    135 #define STACK_REL_P(x) ((x) <= R_RL78_ABS16_REV && (x) >= R_RL78_ABS32)
    136 
    137   EMPTY_HOWTO (0x52),
    138   EMPTY_HOWTO (0x53),
    139   EMPTY_HOWTO (0x54),
    140   EMPTY_HOWTO (0x55),
    141   EMPTY_HOWTO (0x56),
    142   EMPTY_HOWTO (0x57),
    143   EMPTY_HOWTO (0x58),
    144   EMPTY_HOWTO (0x59),
    145   EMPTY_HOWTO (0x5a),
    146   EMPTY_HOWTO (0x5b),
    147   EMPTY_HOWTO (0x5c),
    148   EMPTY_HOWTO (0x5d),
    149   EMPTY_HOWTO (0x5e),
    150   EMPTY_HOWTO (0x5f),
    151   EMPTY_HOWTO (0x60),
    152   EMPTY_HOWTO (0x61),
    153   EMPTY_HOWTO (0x62),
    154   EMPTY_HOWTO (0x63),
    155   EMPTY_HOWTO (0x64),
    156   EMPTY_HOWTO (0x65),
    157   EMPTY_HOWTO (0x66),
    158   EMPTY_HOWTO (0x67),
    159   EMPTY_HOWTO (0x68),
    160   EMPTY_HOWTO (0x69),
    161   EMPTY_HOWTO (0x6a),
    162   EMPTY_HOWTO (0x6b),
    163   EMPTY_HOWTO (0x6c),
    164   EMPTY_HOWTO (0x6d),
    165   EMPTY_HOWTO (0x6e),
    166   EMPTY_HOWTO (0x6f),
    167   EMPTY_HOWTO (0x70),
    168   EMPTY_HOWTO (0x71),
    169   EMPTY_HOWTO (0x72),
    170   EMPTY_HOWTO (0x73),
    171   EMPTY_HOWTO (0x74),
    172   EMPTY_HOWTO (0x75),
    173   EMPTY_HOWTO (0x76),
    174   EMPTY_HOWTO (0x77),
    175 
    176   EMPTY_HOWTO (0x78),
    177   EMPTY_HOWTO (0x79),
    178   EMPTY_HOWTO (0x7a),
    179   EMPTY_HOWTO (0x7b),
    180   EMPTY_HOWTO (0x7c),
    181   EMPTY_HOWTO (0x7d),
    182   EMPTY_HOWTO (0x7e),
    183   EMPTY_HOWTO (0x7f),
    184 
    185   RL78_OP_REL (SYM,       2, 32, 0, dont, FALSE),
    186   RL78_OP_REL (OPneg,     2, 32, 0, dont, FALSE),
    187   RL78_OP_REL (OPadd,     2, 32, 0, dont, FALSE),
    188   RL78_OP_REL (OPsub,     2, 32, 0, dont, FALSE),
    189   RL78_OP_REL (OPmul,     2, 32, 0, dont, FALSE),
    190   RL78_OP_REL (OPdiv,     2, 32, 0, dont, FALSE),
    191   RL78_OP_REL (OPshla,    2, 32, 0, dont, FALSE),
    192   RL78_OP_REL (OPshra,    2, 32, 0, dont, FALSE),
    193   RL78_OP_REL (OPsctsize, 2, 32, 0, dont, FALSE),
    194   EMPTY_HOWTO (0x89),
    195   EMPTY_HOWTO (0x8a),
    196   EMPTY_HOWTO (0x8b),
    197   EMPTY_HOWTO (0x8c),
    198   RL78_OP_REL (OPscttop,  2, 32, 0, dont, FALSE),
    199   EMPTY_HOWTO (0x8e),
    200   EMPTY_HOWTO (0x8f),
    201   RL78_OP_REL (OPand,     2, 32, 0, dont, FALSE),
    202   RL78_OP_REL (OPor,      2, 32, 0, dont, FALSE),
    203   RL78_OP_REL (OPxor,     2, 32, 0, dont, FALSE),
    204   RL78_OP_REL (OPnot,     2, 32, 0, dont, FALSE),
    205   RL78_OP_REL (OPmod,     2, 32, 0, dont, FALSE),
    206   RL78_OP_REL (OPromtop,  2, 32, 0, dont, FALSE),
    207   RL78_OP_REL (OPramtop,  2, 32, 0, dont, FALSE)
    208 };
    209 
    210 /* Map BFD reloc types to RL78 ELF reloc types.  */
    212 
    213 struct rl78_reloc_map
    214 {
    215   bfd_reloc_code_real_type  bfd_reloc_val;
    216   unsigned int              rl78_reloc_val;
    217 };
    218 
    219 static const struct rl78_reloc_map rl78_reloc_map [] =
    220 {
    221   { BFD_RELOC_NONE,		R_RL78_NONE },
    222   { BFD_RELOC_8,		R_RL78_DIR8S },
    223   { BFD_RELOC_16,		R_RL78_DIR16S },
    224   { BFD_RELOC_24,		R_RL78_DIR24S },
    225   { BFD_RELOC_32,		R_RL78_DIR32 },
    226   { BFD_RELOC_RL78_16_OP,	R_RL78_DIR16 },
    227   { BFD_RELOC_RL78_DIR3U_PCREL,	R_RL78_DIR3U_PCREL },
    228   { BFD_RELOC_8_PCREL,		R_RL78_DIR8S_PCREL },
    229   { BFD_RELOC_16_PCREL,		R_RL78_DIR16S_PCREL },
    230   { BFD_RELOC_24_PCREL,		R_RL78_DIR24S_PCREL },
    231   { BFD_RELOC_RL78_8U,		R_RL78_DIR8U },
    232   { BFD_RELOC_RL78_16U,		R_RL78_DIR16U },
    233   { BFD_RELOC_RL78_SYM,		R_RL78_SYM },
    234   { BFD_RELOC_RL78_OP_SUBTRACT,	R_RL78_OPsub },
    235   { BFD_RELOC_RL78_OP_NEG,	R_RL78_OPneg },
    236   { BFD_RELOC_RL78_OP_AND,	R_RL78_OPand },
    237   { BFD_RELOC_RL78_OP_SHRA,	R_RL78_OPshra },
    238   { BFD_RELOC_RL78_ABS8,	R_RL78_ABS8 },
    239   { BFD_RELOC_RL78_ABS16,	R_RL78_ABS16 },
    240   { BFD_RELOC_RL78_ABS16_REV,	R_RL78_ABS16_REV },
    241   { BFD_RELOC_RL78_ABS32,	R_RL78_ABS32 },
    242   { BFD_RELOC_RL78_ABS32_REV,	R_RL78_ABS32_REV },
    243   { BFD_RELOC_RL78_ABS16UL,	R_RL78_ABS16UL },
    244   { BFD_RELOC_RL78_ABS16UW,	R_RL78_ABS16UW },
    245   { BFD_RELOC_RL78_ABS16U,	R_RL78_ABS16U },
    246   { BFD_RELOC_RL78_SADDR,	R_RL78_RH_SADDR },
    247   { BFD_RELOC_RL78_RELAX,	R_RL78_RH_RELAX }
    248 };
    249 
    250 static reloc_howto_type *
    251 rl78_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
    252 			bfd_reloc_code_real_type code)
    253 {
    254   unsigned int i;
    255 
    256   if (code == BFD_RELOC_RL78_32_OP)
    257     return rl78_elf_howto_table + R_RL78_DIR32;
    258 
    259   for (i = ARRAY_SIZE (rl78_reloc_map); i--;)
    260     if (rl78_reloc_map [i].bfd_reloc_val == code)
    261       return rl78_elf_howto_table + rl78_reloc_map[i].rl78_reloc_val;
    262 
    263   return NULL;
    264 }
    265 
    266 static reloc_howto_type *
    267 rl78_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED, const char * r_name)
    268 {
    269   unsigned int i;
    270 
    271   for (i = 0; i < ARRAY_SIZE (rl78_elf_howto_table); i++)
    272     if (rl78_elf_howto_table[i].name != NULL
    273 	&& strcasecmp (rl78_elf_howto_table[i].name, r_name) == 0)
    274       return rl78_elf_howto_table + i;
    275 
    276   return NULL;
    277 }
    278 
    279 /* Set the howto pointer for an RL78 ELF reloc.  */
    280 
    281 static void
    282 rl78_info_to_howto_rela (bfd *               abfd ATTRIBUTE_UNUSED,
    283 			 arelent *           cache_ptr,
    284 			 Elf_Internal_Rela * dst)
    285 {
    286   unsigned int r_type;
    287 
    288   r_type = ELF32_R_TYPE (dst->r_info);
    289   if (r_type >= (unsigned int) R_RL78_max)
    290     {
    291       /* xgettext:c-format */
    292       _bfd_error_handler (_("%B: invalid RL78 reloc number: %d"), abfd, r_type);
    293       r_type = 0;
    294     }
    295   cache_ptr->howto = rl78_elf_howto_table + r_type;
    296 }
    297 
    298 static bfd_vma
    300 get_symbol_value (const char *            name,
    301 		  struct bfd_link_info *  info,
    302 		  bfd *                   input_bfd,
    303 		  asection *              input_section,
    304 		  int			  offset)
    305 {
    306   struct bfd_link_hash_entry * h;
    307 
    308   if (info == NULL)
    309     return 0;
    310 
    311   h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
    312 
    313   if (h == NULL
    314       || (h->type != bfd_link_hash_defined
    315 	  && h->type != bfd_link_hash_defweak))
    316     {
    317       (*info->callbacks->undefined_symbol)
    318 	(info, name, input_bfd, input_section, offset, TRUE);
    319       return 0;
    320     }
    321 
    322   return (h->u.def.value
    323 	  + h->u.def.section->output_section->vma
    324 	  + h->u.def.section->output_offset);
    325 }
    326 
    327 static bfd_vma
    328 get_romstart (struct bfd_link_info *  info,
    329 	      bfd *                   abfd,
    330 	      asection *              sec,
    331 	      int		      offset)
    332 {
    333   static bfd_boolean cached = FALSE;
    334   static bfd_vma     cached_value = 0;
    335 
    336   if (!cached)
    337     {
    338       cached_value = get_symbol_value ("_start", info, abfd, sec, offset);
    339       cached = TRUE;
    340     }
    341   return cached_value;
    342 }
    343 
    344 static bfd_vma
    345 get_ramstart (struct bfd_link_info *  info,
    346 	      bfd *                   abfd,
    347 	      asection *              sec,
    348 	      int		      offset)
    349 {
    350   static bfd_boolean cached = FALSE;
    351   static bfd_vma     cached_value = 0;
    352 
    353   if (!cached)
    354     {
    355       cached_value = get_symbol_value ("__datastart", info, abfd, sec, offset);
    356       cached = TRUE;
    357     }
    358   return cached_value;
    359 }
    360 
    361 #define NUM_STACK_ENTRIES 16
    362 static int32_t rl78_stack [ NUM_STACK_ENTRIES ];
    363 static unsigned int rl78_stack_top;
    364 
    365 #define RL78_STACK_PUSH(val)			\
    366   do						\
    367     {						\
    368       if (rl78_stack_top < NUM_STACK_ENTRIES)	\
    369         rl78_stack [rl78_stack_top ++] = (val);	\
    370       else					\
    371 	_bfd_error_handler (_("Internal Error: RL78 reloc stack overflow")); \
    372     }						\
    373   while (0)
    374 
    375 #define RL78_STACK_POP(dest)			\
    376   do						\
    377     {						\
    378       if (rl78_stack_top > 0)			\
    379         (dest) = rl78_stack [-- rl78_stack_top];\
    380       else					\
    381 	{					\
    382           _bfd_error_handler (_("Internal Error: RL78 reloc stack underflow")); \
    383           (dest) = 0;				\
    384         }					\
    385     }						\
    386   while (0)
    387 
    388 /* Special handling for RL78 complex relocs.  Returns the
    389    value of the reloc, or 0 for relocs which do not generate
    390    a result.  SYMVAL is the value of the symbol for relocs
    391    which use a symbolic argument.  */
    392 
    393 static bfd_vma
    394 rl78_compute_complex_reloc (unsigned long  r_type,
    395 			    bfd_vma        symval,
    396 			    asection *     input_section)
    397 {
    398   int32_t tmp1, tmp2;
    399   bfd_vma relocation;
    400 
    401   switch (r_type)
    402     {
    403     default:
    404       return 0;
    405 
    406     case R_RL78_ABS24S_PCREL:
    407     case R_RL78_ABS16S_PCREL:
    408     case R_RL78_ABS8S_PCREL:
    409       RL78_STACK_POP (relocation);
    410       relocation -= input_section->output_section->vma + input_section->output_offset;
    411       return relocation;
    412 
    413     case R_RL78_ABS32:
    414     case R_RL78_ABS32_REV:
    415     case R_RL78_ABS16:
    416     case R_RL78_ABS16_REV:
    417     case R_RL78_ABS16S:
    418     case R_RL78_ABS16U:
    419     case R_RL78_ABS8:
    420     case R_RL78_ABS8U:
    421     case R_RL78_ABS8S:
    422       RL78_STACK_POP (relocation);
    423       return relocation;
    424 
    425     case R_RL78_ABS16UL:
    426     case R_RL78_ABS8UL:
    427       RL78_STACK_POP (relocation);
    428       return relocation >> 2;
    429 
    430     case R_RL78_ABS16UW:
    431     case R_RL78_ABS8UW:
    432       RL78_STACK_POP (relocation);
    433       return relocation >> 1;
    434 
    435       /* The rest of the relocs compute values and then push them onto the stack.  */
    436     case R_RL78_OPramtop:
    437     case R_RL78_OPromtop:
    438     case R_RL78_SYM:
    439       RL78_STACK_PUSH (symval);
    440       return 0;
    441 
    442     case R_RL78_OPneg:
    443       RL78_STACK_POP (tmp1);
    444       tmp1 = - tmp1;
    445       RL78_STACK_PUSH (tmp1);
    446       return 0;
    447 
    448     case R_RL78_OPadd:
    449       RL78_STACK_POP (tmp2);
    450       RL78_STACK_POP (tmp1);
    451       tmp1 += tmp2;
    452       RL78_STACK_PUSH (tmp1);
    453       return 0;
    454 
    455     case R_RL78_OPsub:
    456       /* For the expression "A - B", the assembler pushes A,
    457 	 then B, then OPSUB.  So the first op we pop is B, not A.  */
    458       RL78_STACK_POP (tmp2);	/* B */
    459       RL78_STACK_POP (tmp1);	/* A */
    460       tmp1 -= tmp2;		/* A - B */
    461       RL78_STACK_PUSH (tmp1);
    462       return 0;
    463 
    464     case R_RL78_OPmul:
    465       RL78_STACK_POP (tmp2);
    466       RL78_STACK_POP (tmp1);
    467       tmp1 *= tmp2;
    468       RL78_STACK_PUSH (tmp1);
    469       return 0;
    470 
    471     case R_RL78_OPdiv:
    472       RL78_STACK_POP (tmp2);
    473       RL78_STACK_POP (tmp1);
    474       tmp1 /= tmp2;
    475       RL78_STACK_PUSH (tmp1);
    476       return 0;
    477 
    478     case R_RL78_OPshla:
    479       RL78_STACK_POP (tmp2);
    480       RL78_STACK_POP (tmp1);
    481       tmp1 <<= tmp2;
    482       RL78_STACK_PUSH (tmp1);
    483       return 0;
    484 
    485     case R_RL78_OPshra:
    486       RL78_STACK_POP (tmp2);
    487       RL78_STACK_POP (tmp1);
    488       tmp1 >>= tmp2;
    489       RL78_STACK_PUSH (tmp1);
    490       return 0;
    491 
    492     case R_RL78_OPsctsize:
    493       RL78_STACK_PUSH (input_section->size);
    494       return 0;
    495 
    496     case R_RL78_OPscttop:
    497       RL78_STACK_PUSH (input_section->output_section->vma);
    498       return 0;
    499 
    500     case R_RL78_OPand:
    501       RL78_STACK_POP (tmp2);
    502       RL78_STACK_POP (tmp1);
    503       tmp1 &= tmp2;
    504       RL78_STACK_PUSH (tmp1);
    505       return 0;
    506 
    507     case R_RL78_OPor:
    508       RL78_STACK_POP (tmp2);
    509       RL78_STACK_POP (tmp1);
    510       tmp1 |= tmp2;
    511       RL78_STACK_PUSH (tmp1);
    512       return 0;
    513 
    514     case R_RL78_OPxor:
    515       RL78_STACK_POP (tmp2);
    516       RL78_STACK_POP (tmp1);
    517       tmp1 ^= tmp2;
    518       RL78_STACK_PUSH (tmp1);
    519       return 0;
    520 
    521     case R_RL78_OPnot:
    522       RL78_STACK_POP (tmp1);
    523       tmp1 = ~ tmp1;
    524       RL78_STACK_PUSH (tmp1);
    525       return 0;
    526 
    527     case R_RL78_OPmod:
    528       RL78_STACK_POP (tmp2);
    529       RL78_STACK_POP (tmp1);
    530       tmp1 %= tmp2;
    531       RL78_STACK_PUSH (tmp1);
    532       return 0;
    533     }
    534 }
    535 
    536 #undef RL78_STACK_PUSH
    537 #undef RL78_STACK_POP
    538 
    539 #define OP(i)      (contents[reloc->address + (i)])
    540 
    541 static bfd_reloc_status_type
    542 rl78_special_reloc (bfd *      input_bfd,
    543 		    arelent *  reloc,
    544 		    asymbol *  symbol,
    545 		    void *     data,
    546 		    asection * input_section,
    547 		    bfd *      output_bfd ATTRIBUTE_UNUSED,
    548 		    char **    error_message ATTRIBUTE_UNUSED)
    549 {
    550   bfd_reloc_status_type  r = bfd_reloc_ok;
    551   bfd_vma                relocation = 0;
    552   unsigned long          r_type = reloc->howto->type;
    553   bfd_byte *             contents = data;
    554 
    555   /* If necessary, compute the symbolic value of the relocation.  */
    556   switch (r_type)
    557     {
    558     case R_RL78_SYM:
    559       relocation = (symbol->value
    560 		    + symbol->section->output_section->vma
    561 		    + symbol->section->output_offset
    562 		    + reloc->addend);
    563 	break;
    564 
    565     case R_RL78_OPromtop:
    566       relocation = get_romstart (NULL, input_bfd, input_section,
    567 				 reloc->address);
    568       break;
    569 
    570     case R_RL78_OPramtop:
    571       relocation = get_ramstart (NULL, input_bfd, input_section,
    572 				 reloc->address);
    573       break;
    574     }
    575 
    576   /* Get the value of the relocation.  */
    577   relocation = rl78_compute_complex_reloc (r_type, relocation, input_section);
    578 
    579   /* If the relocation alters the contents of the section then apply it now.
    580      Note - since this function is called from
    581      bfd_generic_get_relocated_section_contents via bfd_perform_relocation,
    582      and not from the linker, we do not perform any range checking.  The
    583      clients who are calling us are only interested in some relocated section
    584      contents, and not any linkage problems that might occur later.  */
    585   switch (r_type)
    586     {
    587     case R_RL78_ABS32:
    588       OP (0) = relocation;
    589       OP (1) = relocation >> 8;
    590       OP (2) = relocation >> 16;
    591       OP (3) = relocation >> 24;
    592       break;
    593 
    594     case R_RL78_ABS32_REV:
    595       OP (3) = relocation;
    596       OP (2) = relocation >> 8;
    597       OP (1) = relocation >> 16;
    598       OP (0) = relocation >> 24;
    599       break;
    600 
    601     case R_RL78_ABS24S_PCREL:
    602     case R_RL78_ABS24S:
    603       OP (0) = relocation;
    604       OP (1) = relocation >> 8;
    605       OP (2) = relocation >> 16;
    606       break;
    607 
    608     case R_RL78_ABS16_REV:
    609       OP (1) = relocation;
    610       OP (0) = relocation >> 8;
    611       break;
    612 
    613     case R_RL78_ABS16S_PCREL:
    614     case R_RL78_ABS16:
    615     case R_RL78_ABS16S:
    616     case R_RL78_ABS16U:
    617     case R_RL78_ABS16UL:
    618     case R_RL78_ABS16UW:
    619       OP (0) = relocation;
    620       OP (1) = relocation >> 8;
    621       break;
    622 
    623     case R_RL78_ABS8S_PCREL:
    624     case R_RL78_ABS8:
    625     case R_RL78_ABS8U:
    626     case R_RL78_ABS8UL:
    627     case R_RL78_ABS8UW:
    628     case R_RL78_ABS8S:
    629       OP (0) = relocation;
    630       break;
    631 
    632     default:
    633       break;
    634     }
    635 
    636   return r;
    637 }
    638 
    639 #undef  OP
    640 #define OP(i)      (contents[rel->r_offset + (i)])
    641 
    642 /* Relocate an RL78 ELF section.
    643    There is some attempt to make this function usable for many architectures,
    644    both USE_REL and USE_RELA ['twould be nice if such a critter existed],
    645    if only to serve as a learning tool.
    646 
    647    The RELOCATE_SECTION function is called by the new ELF backend linker
    648    to handle the relocations for a section.
    649 
    650    The relocs are always passed as Rela structures; if the section
    651    actually uses Rel structures, the r_addend field will always be
    652    zero.
    653 
    654    This function is responsible for adjusting the section contents as
    655    necessary, and (if using Rela relocs and generating a relocatable
    656    output file) adjusting the reloc addend as necessary.
    657 
    658    This function does not have to worry about setting the reloc
    659    address or the reloc symbol index.
    660 
    661    LOCAL_SYMS is a pointer to the swapped in local symbols.
    662 
    663    LOCAL_SECTIONS is an array giving the section in the input file
    664    corresponding to the st_shndx field of each local symbol.
    665 
    666    The global hash table entry for the global symbols can be found
    667    via elf_sym_hashes (input_bfd).
    668 
    669    When generating relocatable output, this function must handle
    670    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
    671    going to be the section symbol corresponding to the output
    672    section, which means that the addend must be adjusted
    673    accordingly.  */
    674 
    675 static bfd_boolean
    676 rl78_elf_relocate_section
    677     (bfd *                   output_bfd,
    678      struct bfd_link_info *  info,
    679      bfd *                   input_bfd,
    680      asection *              input_section,
    681      bfd_byte *              contents,
    682      Elf_Internal_Rela *     relocs,
    683      Elf_Internal_Sym *      local_syms,
    684      asection **             local_sections)
    685 {
    686   Elf_Internal_Shdr *           symtab_hdr;
    687   struct elf_link_hash_entry ** sym_hashes;
    688   Elf_Internal_Rela *           rel;
    689   Elf_Internal_Rela *           relend;
    690   asection *splt;
    691 
    692   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
    693   sym_hashes = elf_sym_hashes (input_bfd);
    694   relend     = relocs + input_section->reloc_count;
    695 
    696   splt = elf_hash_table (info)->splt;
    697 
    698   for (rel = relocs; rel < relend; rel ++)
    699     {
    700       reloc_howto_type *           howto;
    701       unsigned long                r_symndx;
    702       Elf_Internal_Sym *           sym;
    703       asection *                   sec;
    704       struct elf_link_hash_entry * h;
    705       bfd_vma                      relocation;
    706       bfd_reloc_status_type        r;
    707       const char *                 name = NULL;
    708       bfd_boolean                  unresolved_reloc = TRUE;
    709       int                          r_type;
    710 
    711       r_type = ELF32_R_TYPE (rel->r_info);
    712       r_symndx = ELF32_R_SYM (rel->r_info);
    713 
    714       howto  = rl78_elf_howto_table + ELF32_R_TYPE (rel->r_info);
    715       h      = NULL;
    716       sym    = NULL;
    717       sec    = NULL;
    718       relocation = 0;
    719 
    720       if (r_symndx < symtab_hdr->sh_info)
    721 	{
    722 	  sym = local_syms + r_symndx;
    723 	  sec = local_sections [r_symndx];
    724 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, & sec, rel);
    725 
    726 	  name = bfd_elf_string_from_elf_section
    727 	    (input_bfd, symtab_hdr->sh_link, sym->st_name);
    728 	  name = (sym->st_name == 0) ? bfd_section_name (input_bfd, sec) : name;
    729 	}
    730       else
    731 	{
    732 	  bfd_boolean warned ATTRIBUTE_UNUSED;
    733 	  bfd_boolean ignored ATTRIBUTE_UNUSED;
    734 
    735 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
    736 				   r_symndx, symtab_hdr, sym_hashes, h,
    737 				   sec, relocation, unresolved_reloc,
    738 				   warned, ignored);
    739 
    740 	  name = h->root.root.string;
    741 	}
    742 
    743       if (sec != NULL && discarded_section (sec))
    744 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
    745 					 rel, 1, relend, howto, 0, contents);
    746 
    747       if (bfd_link_relocatable (info))
    748 	{
    749 	  /* This is a relocatable link.  We don't have to change
    750              anything, unless the reloc is against a section symbol,
    751              in which case we have to adjust according to where the
    752              section symbol winds up in the output section.  */
    753 	  if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
    754 	    rel->r_addend += sec->output_offset;
    755 	  continue;
    756 	}
    757 
    758       switch (ELF32_R_TYPE (rel->r_info))
    759 	{
    760 	case R_RL78_DIR16S:
    761 	  {
    762 	    bfd_vma *plt_offset;
    763 
    764 	    if (h != NULL)
    765 	      plt_offset = &h->plt.offset;
    766 	    else
    767 	      plt_offset = elf_local_got_offsets (input_bfd) + r_symndx;
    768 
    769 	    if (! valid_16bit_address (relocation))
    770 	      {
    771 		/* If this is the first time we've processed this symbol,
    772 		   fill in the plt entry with the correct symbol address.  */
    773 		if ((*plt_offset & 1) == 0)
    774 		  {
    775 		    unsigned int x;
    776 
    777 		    x = 0x000000ec;  /* br !!abs24 */
    778 		    x |= (relocation << 8) & 0xffffff00;
    779 		    bfd_put_32 (input_bfd, x, splt->contents + *plt_offset);
    780 		    *plt_offset |= 1;
    781 		  }
    782 
    783 		relocation = (splt->output_section->vma
    784 			      + splt->output_offset
    785 			      + (*plt_offset & -2));
    786 		if (name)
    787 		{
    788 		  char *newname = bfd_malloc (strlen(name)+5);
    789 		  strcpy (newname, name);
    790 		  strcat(newname, ".plt");
    791 		  _bfd_generic_link_add_one_symbol (info,
    792 						    input_bfd,
    793 						    newname,
    794 						    BSF_FUNCTION | BSF_WEAK,
    795 						    splt,
    796 						    (*plt_offset & -2),
    797 						    0,
    798 						    1,
    799 						    0,
    800 						    0);
    801 		}
    802 	      }
    803 	  }
    804 	  break;
    805 	}
    806 
    807       if (h != NULL && h->root.type == bfd_link_hash_undefweak)
    808 	/* If the symbol is undefined and weak
    809 	   then the relocation resolves to zero.  */
    810 	relocation = 0;
    811       else
    812 	{
    813 	  if (howto->pc_relative)
    814 	    {
    815 	      relocation -= (input_section->output_section->vma
    816 			     + input_section->output_offset
    817 			     + rel->r_offset);
    818 	      relocation -= bfd_get_reloc_size (howto);
    819 	    }
    820 
    821 	  relocation += rel->r_addend;
    822 	}
    823 
    824       r = bfd_reloc_ok;
    825 
    826 #define RANGE(a,b) if (a > (long) relocation || (long) relocation > b) r = bfd_reloc_overflow
    827 
    828       /* Opcode relocs are always big endian.  Data relocs are bi-endian.  */
    829       switch (r_type)
    830 	{
    831 	case R_RL78_NONE:
    832 	  break;
    833 
    834 	case R_RL78_RH_RELAX:
    835 	  break;
    836 
    837 	case R_RL78_DIR8S_PCREL:
    838 	  RANGE (-128, 127);
    839 	  OP (0) = relocation;
    840 	  break;
    841 
    842 	case R_RL78_DIR8S:
    843 	  RANGE (-128, 255);
    844 	  OP (0) = relocation;
    845 	  break;
    846 
    847 	case R_RL78_DIR8U:
    848 	  RANGE (0, 255);
    849 	  OP (0) = relocation;
    850 	  break;
    851 
    852 	case R_RL78_DIR16S_PCREL:
    853 	  RANGE (-32768, 32767);
    854 	  OP (0) = relocation;
    855 	  OP (1) = relocation >> 8;
    856 	  break;
    857 
    858 	case R_RL78_DIR16S:
    859 	  if ((relocation & 0xf0000) == 0xf0000)
    860 	    relocation &= 0xffff;
    861 	  RANGE (-32768, 65535);
    862 	  OP (0) = relocation;
    863 	  OP (1) = relocation >> 8;
    864 	  break;
    865 
    866 	case R_RL78_DIR16U:
    867 	  RANGE (0, 65536);
    868 	  OP (0) = relocation;
    869 	  OP (1) = relocation >> 8;
    870 	  break;
    871 
    872 	case R_RL78_DIR16:
    873 	  RANGE (-32768, 65536);
    874 	  OP (0) = relocation;
    875 	  OP (1) = relocation >> 8;
    876 	  break;
    877 
    878 	case R_RL78_DIR16_REV:
    879 	  RANGE (-32768, 65536);
    880 	  OP (1) = relocation;
    881 	  OP (0) = relocation >> 8;
    882 	  break;
    883 
    884 	case R_RL78_DIR3U_PCREL:
    885 	  RANGE (3, 10);
    886 	  OP (0) &= 0xf8;
    887 	  OP (0) |= relocation & 0x07;
    888 	  break;
    889 
    890 	case R_RL78_DIR24S_PCREL:
    891 	  RANGE (-0x800000, 0x7fffff);
    892 	  OP (0) = relocation;
    893 	  OP (1) = relocation >> 8;
    894 	  OP (2) = relocation >> 16;
    895 	  break;
    896 
    897 	case R_RL78_DIR24S:
    898 	  RANGE (-0x800000, 0x7fffff);
    899 	  OP (0) = relocation;
    900 	  OP (1) = relocation >> 8;
    901 	  OP (2) = relocation >> 16;
    902 	  break;
    903 
    904 	case R_RL78_DIR32:
    905 	  OP (0) = relocation;
    906 	  OP (1) = relocation >> 8;
    907 	  OP (2) = relocation >> 16;
    908 	  OP (3) = relocation >> 24;
    909 	  break;
    910 
    911 	case R_RL78_DIR32_REV:
    912 	  OP (3) = relocation;
    913 	  OP (2) = relocation >> 8;
    914 	  OP (1) = relocation >> 16;
    915 	  OP (0) = relocation >> 24;
    916 	  break;
    917 
    918 	case R_RL78_RH_SFR:
    919 	  RANGE (0xfff00, 0xfffff);
    920 	  OP (0) = relocation & 0xff;
    921 	  break;
    922 
    923 	case R_RL78_RH_SADDR:
    924 	  RANGE (0xffe20, 0xfff1f);
    925 	  OP (0) = relocation & 0xff;
    926 	  break;
    927 
    928 	  /* Complex reloc handling:  */
    929 	case R_RL78_ABS32:
    930 	case R_RL78_ABS32_REV:
    931 	case R_RL78_ABS24S_PCREL:
    932 	case R_RL78_ABS24S:
    933 	case R_RL78_ABS16:
    934 	case R_RL78_ABS16_REV:
    935 	case R_RL78_ABS16S_PCREL:
    936 	case R_RL78_ABS16S:
    937 	case R_RL78_ABS16U:
    938 	case R_RL78_ABS16UL:
    939 	case R_RL78_ABS16UW:
    940 	case R_RL78_ABS8:
    941 	case R_RL78_ABS8U:
    942 	case R_RL78_ABS8UL:
    943 	case R_RL78_ABS8UW:
    944 	case R_RL78_ABS8S_PCREL:
    945 	case R_RL78_ABS8S:
    946 	case R_RL78_OPneg:
    947 	case R_RL78_OPadd:
    948 	case R_RL78_OPsub:
    949 	case R_RL78_OPmul:
    950 	case R_RL78_OPdiv:
    951 	case R_RL78_OPshla:
    952 	case R_RL78_OPshra:
    953 	case R_RL78_OPsctsize:
    954 	case R_RL78_OPscttop:
    955 	case R_RL78_OPand:
    956 	case R_RL78_OPor:
    957 	case R_RL78_OPxor:
    958 	case R_RL78_OPnot:
    959 	case R_RL78_OPmod:
    960 	  relocation = rl78_compute_complex_reloc (r_type, 0, input_section);
    961 
    962 	  switch (r_type)
    963 	    {
    964 	    case R_RL78_ABS32:
    965 	      OP (0) = relocation;
    966 	      OP (1) = relocation >> 8;
    967 	      OP (2) = relocation >> 16;
    968 	      OP (3) = relocation >> 24;
    969 	      break;
    970 
    971 	    case R_RL78_ABS32_REV:
    972 	      OP (3) = relocation;
    973 	      OP (2) = relocation >> 8;
    974 	      OP (1) = relocation >> 16;
    975 	      OP (0) = relocation >> 24;
    976 	      break;
    977 
    978 	    case R_RL78_ABS24S_PCREL:
    979 	    case R_RL78_ABS24S:
    980 	      RANGE (-0x800000, 0x7fffff);
    981 	      OP (0) = relocation;
    982 	      OP (1) = relocation >> 8;
    983 	      OP (2) = relocation >> 16;
    984 	      break;
    985 
    986 	    case R_RL78_ABS16:
    987 	      RANGE (-32768, 65535);
    988 	      OP (0) = relocation;
    989 	      OP (1) = relocation >> 8;
    990 	      break;
    991 
    992 	    case R_RL78_ABS16_REV:
    993 	      RANGE (-32768, 65535);
    994 	      OP (1) = relocation;
    995 	      OP (0) = relocation >> 8;
    996 	      break;
    997 
    998 	    case R_RL78_ABS16S_PCREL:
    999 	    case R_RL78_ABS16S:
   1000 	      RANGE (-32768, 32767);
   1001 	      OP (0) = relocation;
   1002 	      OP (1) = relocation >> 8;
   1003 	      break;
   1004 
   1005 	    case R_RL78_ABS16U:
   1006 	    case R_RL78_ABS16UL:
   1007 	    case R_RL78_ABS16UW:
   1008 	      RANGE (0, 65536);
   1009 	      OP (0) = relocation;
   1010 	      OP (1) = relocation >> 8;
   1011 	      break;
   1012 
   1013 	    case R_RL78_ABS8:
   1014 	      RANGE (-128, 255);
   1015 	      OP (0) = relocation;
   1016 	      break;
   1017 
   1018 	    case R_RL78_ABS8U:
   1019 	    case R_RL78_ABS8UL:
   1020 	    case R_RL78_ABS8UW:
   1021 	      RANGE (0, 255);
   1022 	      OP (0) = relocation;
   1023 	      break;
   1024 
   1025 	    case R_RL78_ABS8S_PCREL:
   1026 	    case R_RL78_ABS8S:
   1027 	      RANGE (-128, 127);
   1028 	      OP (0) = relocation;
   1029 	      break;
   1030 
   1031 	    default:
   1032 	      break;
   1033 	    }
   1034 	  break;
   1035 
   1036 	case R_RL78_SYM:
   1037 	  if (r_symndx < symtab_hdr->sh_info)
   1038 	    relocation = sec->output_section->vma + sec->output_offset
   1039 	      + sym->st_value + rel->r_addend;
   1040 	  else if (h != NULL
   1041 		   && (h->root.type == bfd_link_hash_defined
   1042 		       || h->root.type == bfd_link_hash_defweak))
   1043 	    relocation = h->root.u.def.value
   1044 	      + sec->output_section->vma
   1045 	      + sec->output_offset
   1046 	      + rel->r_addend;
   1047 	  else
   1048 	    {
   1049 	      relocation = 0;
   1050 	      if (h->root.type != bfd_link_hash_undefweak)
   1051 		_bfd_error_handler (_("Warning: RL78_SYM reloc with an unknown symbol"));
   1052 	    }
   1053 	  (void) rl78_compute_complex_reloc (r_type, relocation, input_section);
   1054 	  break;
   1055 
   1056 	case R_RL78_OPromtop:
   1057 	  relocation = get_romstart (info, input_bfd, input_section, rel->r_offset);
   1058 	  (void) rl78_compute_complex_reloc (r_type, relocation, input_section);
   1059 	  break;
   1060 
   1061 	case R_RL78_OPramtop:
   1062 	  relocation = get_ramstart (info, input_bfd, input_section, rel->r_offset);
   1063 	  (void) rl78_compute_complex_reloc (r_type, relocation, input_section);
   1064 	  break;
   1065 
   1066 	default:
   1067 	  r = bfd_reloc_notsupported;
   1068 	  break;
   1069 	}
   1070 
   1071       if (r != bfd_reloc_ok)
   1072 	{
   1073 	  const char * msg = NULL;
   1074 
   1075 	  switch (r)
   1076 	    {
   1077 	    case bfd_reloc_overflow:
   1078 	      /* Catch the case of a missing function declaration
   1079 		 and emit a more helpful error message.  */
   1080 	      if (r_type == R_RL78_DIR24S_PCREL)
   1081 		/* xgettext:c-format */
   1082 		msg = _("%B(%A): error: call to undefined function '%s'");
   1083 	      else
   1084 		(*info->callbacks->reloc_overflow)
   1085 		  (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
   1086 		   input_bfd, input_section, rel->r_offset);
   1087 	      break;
   1088 
   1089 	    case bfd_reloc_undefined:
   1090 	      (*info->callbacks->undefined_symbol)
   1091 		(info, name, input_bfd, input_section, rel->r_offset, TRUE);
   1092 	      break;
   1093 
   1094 	    case bfd_reloc_other:
   1095 	      /* xgettext:c-format */
   1096 	      msg = _("%B(%A): warning: unaligned access to symbol '%s' in the small data area");
   1097 	      break;
   1098 
   1099 	    case bfd_reloc_outofrange:
   1100 	      /* xgettext:c-format */
   1101 	      msg = _("%B(%A): internal error: out of range error");
   1102 	      break;
   1103 
   1104 	    case bfd_reloc_notsupported:
   1105 	      /* xgettext:c-format */
   1106 	      msg = _("%B(%A): internal error: unsupported relocation error");
   1107 	      break;
   1108 
   1109 	    case bfd_reloc_dangerous:
   1110 	      /* xgettext:c-format */
   1111 	      msg = _("%B(%A): internal error: dangerous relocation");
   1112 	      break;
   1113 
   1114 	    default:
   1115 	      /* xgettext:c-format */
   1116 	      msg = _("%B(%A): internal error: unknown error");
   1117 	      break;
   1118 	    }
   1119 
   1120 	  if (msg)
   1121 	    _bfd_error_handler (msg, input_bfd, input_section, name);
   1122 	}
   1123     }
   1124 
   1125   return TRUE;
   1126 }
   1127 
   1128 /* Function to set the ELF flag bits.  */
   1130 
   1131 static bfd_boolean
   1132 rl78_elf_set_private_flags (bfd * abfd, flagword flags)
   1133 {
   1134   elf_elfheader (abfd)->e_flags = flags;
   1135   elf_flags_init (abfd) = TRUE;
   1136   return TRUE;
   1137 }
   1138 
   1139 static bfd_boolean no_warn_mismatch = FALSE;
   1140 
   1141 void bfd_elf32_rl78_set_target_flags (bfd_boolean);
   1142 
   1143 void
   1144 bfd_elf32_rl78_set_target_flags (bfd_boolean user_no_warn_mismatch)
   1145 {
   1146   no_warn_mismatch = user_no_warn_mismatch;
   1147 }
   1148 
   1149 static const char *
   1150 rl78_cpu_name (flagword flags)
   1151 {
   1152   switch (flags & E_FLAG_RL78_CPU_MASK)
   1153     {
   1154     default: return "";
   1155     case E_FLAG_RL78_G10:     return "G10";
   1156     case E_FLAG_RL78_G13:     return "G13";
   1157     case E_FLAG_RL78_G14:     return "G14";
   1158     }
   1159 }
   1160 
   1161 /* Merge backend specific data from an object file to the output
   1162    object file when linking.  */
   1163 
   1164 static bfd_boolean
   1165 rl78_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   1166 {
   1167   bfd *obfd = info->output_bfd;
   1168   flagword new_flags;
   1169   flagword old_flags;
   1170   bfd_boolean error = FALSE;
   1171 
   1172   new_flags = elf_elfheader (ibfd)->e_flags;
   1173   old_flags = elf_elfheader (obfd)->e_flags;
   1174 
   1175   if (!elf_flags_init (obfd))
   1176     {
   1177       /* First call, no flags set.  */
   1178       elf_flags_init (obfd) = TRUE;
   1179       elf_elfheader (obfd)->e_flags = new_flags;
   1180     }
   1181   else if (old_flags != new_flags)
   1182     {
   1183       flagword changed_flags = old_flags ^ new_flags;
   1184 
   1185       if (changed_flags & E_FLAG_RL78_CPU_MASK)
   1186 	{
   1187 	  flagword out_cpu = old_flags & E_FLAG_RL78_CPU_MASK;
   1188 	  flagword in_cpu = new_flags & E_FLAG_RL78_CPU_MASK;
   1189 
   1190 	  if (in_cpu == E_FLAG_RL78_ANY_CPU || in_cpu == out_cpu)
   1191 	    /* It does not matter what new_cpu may have.  */;
   1192 	  else if (out_cpu == E_FLAG_RL78_ANY_CPU)
   1193 	    {
   1194 	      if (in_cpu == E_FLAG_RL78_G10)
   1195 		{
   1196 		  /* G10 files can only be linked with other G10 files.
   1197 		     If the output is set to "any" this means that it is
   1198 		     a G14 file that does not use hardware multiply/divide,
   1199 		     but that is still incompatible with the G10 ABI.  */
   1200 		  error = TRUE;
   1201 
   1202 		  _bfd_error_handler
   1203 		    /* xgettext:c-format */
   1204 		    (_("RL78 ABI conflict: G10 file %B cannot be linked"
   1205 		       " with %s file %B"),
   1206 		     ibfd, rl78_cpu_name (out_cpu), obfd);
   1207 		}
   1208 	      else
   1209 		{
   1210 		  old_flags &= ~ E_FLAG_RL78_CPU_MASK;
   1211 		  old_flags |= in_cpu;
   1212 		  elf_elfheader (obfd)->e_flags = old_flags;
   1213 		}
   1214 	    }
   1215 	  else
   1216 	    {
   1217 	      error = TRUE;
   1218 
   1219 	      _bfd_error_handler
   1220 		/* xgettext:c-format */
   1221 		(_("RL78 ABI conflict: cannot link %s file %B with %s file %B"),
   1222 		 rl78_cpu_name (in_cpu),  ibfd,
   1223 		 rl78_cpu_name (out_cpu), obfd);
   1224 	    }
   1225 	}
   1226 
   1227       if (changed_flags & E_FLAG_RL78_64BIT_DOUBLES)
   1228 	{
   1229 	  _bfd_error_handler
   1230 	    (_("RL78 merge conflict: cannot link 32-bit and 64-bit objects together"));
   1231 
   1232 	  if (old_flags & E_FLAG_RL78_64BIT_DOUBLES)
   1233 	    /* xgettext:c-format */
   1234 	    _bfd_error_handler (_("- %B is 64-bit, %B is not"),
   1235 				obfd, ibfd);
   1236 	  else
   1237 	    /* xgettext:c-format */
   1238 	    _bfd_error_handler (_("- %B is 64-bit, %B is not"),
   1239 				ibfd, obfd);
   1240 	  error = TRUE;
   1241 	}
   1242     }
   1243 
   1244   return !error;
   1245 }
   1246 
   1247 static bfd_boolean
   1249 rl78_elf_print_private_bfd_data (bfd * abfd, void * ptr)
   1250 {
   1251   FILE * file = (FILE *) ptr;
   1252   flagword flags;
   1253 
   1254   BFD_ASSERT (abfd != NULL && ptr != NULL);
   1255 
   1256   /* Print normal ELF private data.  */
   1257   _bfd_elf_print_private_bfd_data (abfd, ptr);
   1258 
   1259   flags = elf_elfheader (abfd)->e_flags;
   1260   fprintf (file, _("private flags = 0x%lx:"), (long) flags);
   1261 
   1262   if (flags & E_FLAG_RL78_CPU_MASK)
   1263     fprintf (file, " [%s]", rl78_cpu_name (flags));
   1264 
   1265   if (flags & E_FLAG_RL78_64BIT_DOUBLES)
   1266     fprintf (file, _(" [64-bit doubles]"));
   1267 
   1268   fputc ('\n', file);
   1269   return TRUE;
   1270 }
   1271 
   1272 /* Return the MACH for an e_flags value.  */
   1273 
   1274 static int
   1275 elf32_rl78_machine (bfd * abfd ATTRIBUTE_UNUSED)
   1276 {
   1277   return bfd_mach_rl78;
   1278 }
   1279 
   1280 static bfd_boolean
   1281 rl78_elf_object_p (bfd * abfd)
   1282 {
   1283   bfd_default_set_arch_mach (abfd, bfd_arch_rl78,
   1284 			     elf32_rl78_machine (abfd));
   1285   return TRUE;
   1286 }
   1287 
   1288 /* support PLT for 16-bit references to 24-bit functions.  */
   1290 
   1291 /* We support 16-bit pointers to code above 64k by generating a thunk
   1292    below 64k containing a JMP instruction to the final address.  */
   1293 
   1294 static bfd_boolean
   1295 rl78_elf_check_relocs
   1296     (bfd *                     abfd,
   1297      struct bfd_link_info *    info,
   1298      asection *                sec,
   1299      const Elf_Internal_Rela * relocs)
   1300 {
   1301   Elf_Internal_Shdr *           symtab_hdr;
   1302   struct elf_link_hash_entry ** sym_hashes;
   1303   const Elf_Internal_Rela *     rel;
   1304   const Elf_Internal_Rela *     rel_end;
   1305   bfd_vma *local_plt_offsets;
   1306   asection *splt;
   1307   bfd *dynobj;
   1308 
   1309   if (bfd_link_relocatable (info))
   1310     return TRUE;
   1311 
   1312   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1313   sym_hashes = elf_sym_hashes (abfd);
   1314   local_plt_offsets = elf_local_got_offsets (abfd);
   1315   dynobj = elf_hash_table(info)->dynobj;
   1316 
   1317   rel_end = relocs + sec->reloc_count;
   1318   for (rel = relocs; rel < rel_end; rel++)
   1319     {
   1320       struct elf_link_hash_entry *h;
   1321       unsigned long r_symndx;
   1322       bfd_vma *offset;
   1323 
   1324       r_symndx = ELF32_R_SYM (rel->r_info);
   1325       if (r_symndx < symtab_hdr->sh_info)
   1326         h = NULL;
   1327       else
   1328 	{
   1329 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   1330 	  while (h->root.type == bfd_link_hash_indirect
   1331 		 || h->root.type == bfd_link_hash_warning)
   1332 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   1333 
   1334 	  /* PR15323, ref flags aren't set for references in the same
   1335 	     object.  */
   1336 	  h->root.non_ir_ref = 1;
   1337 	}
   1338 
   1339       switch (ELF32_R_TYPE (rel->r_info))
   1340         {
   1341 	  /* This relocation describes a 16-bit pointer to a function.
   1342 	     We may need to allocate a thunk in low memory; reserve memory
   1343 	     for it now.  */
   1344 	case R_RL78_DIR16S:
   1345 	  if (dynobj == NULL)
   1346 	    elf_hash_table (info)->dynobj = dynobj = abfd;
   1347 	  splt = elf_hash_table (info)->splt;
   1348 	  if (splt == NULL)
   1349 	    {
   1350 	      flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
   1351 				| SEC_IN_MEMORY | SEC_LINKER_CREATED
   1352 				| SEC_READONLY | SEC_CODE);
   1353 	      splt = bfd_make_section_anyway_with_flags (dynobj, ".plt",
   1354 							 flags);
   1355 	      elf_hash_table (info)->splt = splt;
   1356 	      if (splt == NULL
   1357 		  || ! bfd_set_section_alignment (dynobj, splt, 1))
   1358 		return FALSE;
   1359 	    }
   1360 
   1361 	  if (h != NULL)
   1362 	    offset = &h->plt.offset;
   1363 	  else
   1364 	    {
   1365 	      if (local_plt_offsets == NULL)
   1366 		{
   1367 		  size_t size;
   1368 		  unsigned int i;
   1369 
   1370 		  size = symtab_hdr->sh_info * sizeof (bfd_vma);
   1371 		  local_plt_offsets = (bfd_vma *) bfd_alloc (abfd, size);
   1372 		  if (local_plt_offsets == NULL)
   1373 		    return FALSE;
   1374 		  elf_local_got_offsets (abfd) = local_plt_offsets;
   1375 
   1376 		  for (i = 0; i < symtab_hdr->sh_info; i++)
   1377 		    local_plt_offsets[i] = (bfd_vma) -1;
   1378 		}
   1379 	      offset = &local_plt_offsets[r_symndx];
   1380 	    }
   1381 
   1382 	  if (*offset == (bfd_vma) -1)
   1383 	    {
   1384 	      *offset = splt->size;
   1385 	      splt->size += 4;
   1386 	    }
   1387 	  break;
   1388         }
   1389     }
   1390 
   1391   return TRUE;
   1392 }
   1393 
   1394 /* This must exist if dynobj is ever set.  */
   1395 
   1396 static bfd_boolean
   1397 rl78_elf_finish_dynamic_sections (bfd *abfd ATTRIBUTE_UNUSED,
   1398                                   struct bfd_link_info *info)
   1399 {
   1400   bfd *dynobj;
   1401   asection *splt;
   1402 
   1403   if (!elf_hash_table (info)->dynamic_sections_created)
   1404     return TRUE;
   1405 
   1406   /* As an extra sanity check, verify that all plt entries have been
   1407      filled in.  However, relaxing might have changed the relocs so
   1408      that some plt entries don't get filled in, so we have to skip
   1409      this check if we're relaxing.  Unfortunately, check_relocs is
   1410      called before relaxation.  */
   1411 
   1412   if (info->relax_trip > 0)
   1413     return TRUE;
   1414 
   1415   dynobj = elf_hash_table (info)->dynobj;
   1416   splt = elf_hash_table (info)->splt;
   1417   if (dynobj != NULL && splt != NULL)
   1418     {
   1419       bfd_byte *contents = splt->contents;
   1420       unsigned int i, size = splt->size;
   1421 
   1422       for (i = 0; i < size; i += 4)
   1423 	{
   1424 	  unsigned int x = bfd_get_32 (dynobj, contents + i);
   1425 	  BFD_ASSERT (x != 0);
   1426 	}
   1427     }
   1428 
   1429   return TRUE;
   1430 }
   1431 
   1432 static bfd_boolean
   1433 rl78_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   1434                                struct bfd_link_info *info)
   1435 {
   1436   bfd *dynobj;
   1437   asection *splt;
   1438 
   1439   if (bfd_link_relocatable (info))
   1440     return TRUE;
   1441 
   1442   dynobj = elf_hash_table (info)->dynobj;
   1443   if (dynobj == NULL)
   1444     return TRUE;
   1445 
   1446   splt = elf_hash_table (info)->splt;
   1447   BFD_ASSERT (splt != NULL);
   1448 
   1449   splt->contents = (bfd_byte *) bfd_zalloc (dynobj, splt->size);
   1450   if (splt->contents == NULL)
   1451     return FALSE;
   1452 
   1453   return TRUE;
   1454 }
   1455 
   1456 
   1457 
   1459 /* Handle relaxing.  */
   1460 
   1461 /* A subroutine of rl78_elf_relax_section.  If the global symbol H
   1462    is within the low 64k, remove any entry for it in the plt.  */
   1463 
   1464 struct relax_plt_data
   1465 {
   1466   asection *splt;
   1467   bfd_boolean *again;
   1468 };
   1469 
   1470 static bfd_boolean
   1471 rl78_relax_plt_check (struct elf_link_hash_entry *h, void * xdata)
   1472 {
   1473   struct relax_plt_data *data = (struct relax_plt_data *) xdata;
   1474 
   1475   if (h->plt.offset != (bfd_vma) -1)
   1476     {
   1477       bfd_vma address;
   1478 
   1479       if (h->root.type == bfd_link_hash_undefined
   1480 	  || h->root.type == bfd_link_hash_undefweak)
   1481 	address = 0;
   1482       else
   1483 	address = (h->root.u.def.section->output_section->vma
   1484 		   + h->root.u.def.section->output_offset
   1485 		   + h->root.u.def.value);
   1486 
   1487       if (valid_16bit_address (address))
   1488 	{
   1489 	  h->plt.offset = -1;
   1490 	  data->splt->size -= 4;
   1491 	  *data->again = TRUE;
   1492 	}
   1493     }
   1494 
   1495   return TRUE;
   1496 }
   1497 
   1498 /* A subroutine of rl78_elf_relax_section.  If the global symbol H
   1499    previously had a plt entry, give it a new entry offset.  */
   1500 
   1501 static bfd_boolean
   1502 rl78_relax_plt_realloc (struct elf_link_hash_entry *h, void * xdata)
   1503 {
   1504   bfd_vma *entry = (bfd_vma *) xdata;
   1505 
   1506   if (h->plt.offset != (bfd_vma) -1)
   1507     {
   1508       h->plt.offset = *entry;
   1509       *entry += 4;
   1510     }
   1511 
   1512   return TRUE;
   1513 }
   1514 
   1515 static bfd_boolean
   1516 rl78_elf_relax_plt_section (bfd *dynobj,
   1517                             asection *splt,
   1518                             struct bfd_link_info *info,
   1519                             bfd_boolean *again)
   1520 {
   1521   struct relax_plt_data relax_plt_data;
   1522   bfd *ibfd;
   1523 
   1524   /* Assume nothing changes.  */
   1525   *again = FALSE;
   1526 
   1527   if (bfd_link_relocatable (info))
   1528     return TRUE;
   1529 
   1530   /* We only relax the .plt section at the moment.  */
   1531   if (dynobj != elf_hash_table (info)->dynobj
   1532       || strcmp (splt->name, ".plt") != 0)
   1533     return TRUE;
   1534 
   1535   /* Quick check for an empty plt.  */
   1536   if (splt->size == 0)
   1537     return TRUE;
   1538 
   1539   /* Map across all global symbols; see which ones happen to
   1540      fall in the low 64k.  */
   1541   relax_plt_data.splt = splt;
   1542   relax_plt_data.again = again;
   1543   elf_link_hash_traverse (elf_hash_table (info), rl78_relax_plt_check,
   1544 			  &relax_plt_data);
   1545 
   1546   /* Likewise for local symbols, though that's somewhat less convenient
   1547      as we have to walk the list of input bfds and swap in symbol data.  */
   1548   for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
   1549     {
   1550       bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
   1551       Elf_Internal_Shdr *symtab_hdr;
   1552       Elf_Internal_Sym *isymbuf = NULL;
   1553       unsigned int idx;
   1554 
   1555       if (! local_plt_offsets)
   1556 	continue;
   1557 
   1558       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
   1559       if (symtab_hdr->sh_info != 0)
   1560 	{
   1561 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
   1562 	  if (isymbuf == NULL)
   1563 	    isymbuf = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
   1564 					    symtab_hdr->sh_info, 0,
   1565 					    NULL, NULL, NULL);
   1566 	  if (isymbuf == NULL)
   1567 	    return FALSE;
   1568 	}
   1569 
   1570       for (idx = 0; idx < symtab_hdr->sh_info; ++idx)
   1571 	{
   1572 	  Elf_Internal_Sym *isym;
   1573 	  asection *tsec;
   1574 	  bfd_vma address;
   1575 
   1576 	  if (local_plt_offsets[idx] == (bfd_vma) -1)
   1577 	    continue;
   1578 
   1579 	  isym = &isymbuf[idx];
   1580 	  if (isym->st_shndx == SHN_UNDEF)
   1581 	    continue;
   1582 	  else if (isym->st_shndx == SHN_ABS)
   1583 	    tsec = bfd_abs_section_ptr;
   1584 	  else if (isym->st_shndx == SHN_COMMON)
   1585 	    tsec = bfd_com_section_ptr;
   1586 	  else
   1587 	    tsec = bfd_section_from_elf_index (ibfd, isym->st_shndx);
   1588 
   1589 	  address = (tsec->output_section->vma
   1590 		     + tsec->output_offset
   1591 		     + isym->st_value);
   1592 	  if (valid_16bit_address (address))
   1593 	    {
   1594 	      local_plt_offsets[idx] = -1;
   1595 	      splt->size -= 4;
   1596 	      *again = TRUE;
   1597 	    }
   1598 	}
   1599 
   1600       if (isymbuf != NULL
   1601 	  && symtab_hdr->contents != (unsigned char *) isymbuf)
   1602 	{
   1603 	  if (! info->keep_memory)
   1604 	    free (isymbuf);
   1605 	  else
   1606 	    {
   1607 	      /* Cache the symbols for elf_link_input_bfd.  */
   1608 	      symtab_hdr->contents = (unsigned char *) isymbuf;
   1609 	    }
   1610 	}
   1611     }
   1612 
   1613   /* If we changed anything, walk the symbols again to reallocate
   1614      .plt entry addresses.  */
   1615   if (*again && splt->size > 0)
   1616     {
   1617       bfd_vma entry = 0;
   1618 
   1619       elf_link_hash_traverse (elf_hash_table (info),
   1620 			      rl78_relax_plt_realloc, &entry);
   1621 
   1622       for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
   1623 	{
   1624 	  bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
   1625 	  unsigned int nlocals = elf_tdata (ibfd)->symtab_hdr.sh_info;
   1626 	  unsigned int idx;
   1627 
   1628 	  if (! local_plt_offsets)
   1629 	    continue;
   1630 
   1631 	  for (idx = 0; idx < nlocals; ++idx)
   1632 	    if (local_plt_offsets[idx] != (bfd_vma) -1)
   1633 	      {
   1634 	        local_plt_offsets[idx] = entry;
   1635 		entry += 4;
   1636 	      }
   1637 	}
   1638     }
   1639 
   1640   return TRUE;
   1641 }
   1642 
   1643 /* Delete some bytes from a section while relaxing.  */
   1644 
   1645 static bfd_boolean
   1646 elf32_rl78_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count,
   1647 			       Elf_Internal_Rela *alignment_rel, int force_snip)
   1648 {
   1649   Elf_Internal_Shdr * symtab_hdr;
   1650   unsigned int        sec_shndx;
   1651   bfd_byte *          contents;
   1652   Elf_Internal_Rela * irel;
   1653   Elf_Internal_Rela * irelend;
   1654   Elf_Internal_Sym *  isym;
   1655   Elf_Internal_Sym *  isymend;
   1656   bfd_vma             toaddr;
   1657   unsigned int        symcount;
   1658   struct elf_link_hash_entry ** sym_hashes;
   1659   struct elf_link_hash_entry ** end_hashes;
   1660 
   1661   if (!alignment_rel)
   1662     force_snip = 1;
   1663 
   1664   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
   1665 
   1666   contents = elf_section_data (sec)->this_hdr.contents;
   1667 
   1668   /* The deletion must stop at the next alignment boundary, if
   1669      ALIGNMENT_REL is non-NULL.  */
   1670   toaddr = sec->size;
   1671   if (alignment_rel)
   1672     toaddr = alignment_rel->r_offset;
   1673 
   1674   irel = elf_section_data (sec)->relocs;
   1675   if (irel == NULL)
   1676     {
   1677       _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL, TRUE);
   1678       irel = elf_section_data (sec)->relocs;
   1679     }
   1680 
   1681   irelend = irel + sec->reloc_count;
   1682 
   1683   /* Actually delete the bytes.  */
   1684   memmove (contents + addr, contents + addr + count,
   1685 	   (size_t) (toaddr - addr - count));
   1686 
   1687   /* If we don't have an alignment marker to worry about, we can just
   1688      shrink the section.  Otherwise, we have to fill in the newly
   1689      created gap with NOP insns (0x03).  */
   1690   if (force_snip)
   1691     sec->size -= count;
   1692   else
   1693     memset (contents + toaddr - count, 0x03, count);
   1694 
   1695   /* Adjust all the relocs.  */
   1696   for (; irel && irel < irelend; irel++)
   1697     {
   1698       /* Get the new reloc address.  */
   1699       if (irel->r_offset > addr
   1700 	  && (irel->r_offset < toaddr
   1701 	      || (force_snip && irel->r_offset == toaddr)))
   1702 	irel->r_offset -= count;
   1703 
   1704       /* If we see an ALIGN marker at the end of the gap, we move it
   1705 	 to the beginning of the gap, since marking these gaps is what
   1706 	 they're for.  */
   1707       if (irel->r_offset == toaddr
   1708 	  && ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
   1709 	  && irel->r_addend & RL78_RELAXA_ALIGN)
   1710 	irel->r_offset -= count;
   1711     }
   1712 
   1713   /* Adjust the local symbols defined in this section.  */
   1714   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1715   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
   1716   isymend = isym + symtab_hdr->sh_info;
   1717 
   1718   for (; isym < isymend; isym++)
   1719     {
   1720       /* If the symbol is in the range of memory we just moved, we
   1721 	 have to adjust its value.  */
   1722       if (isym->st_shndx == sec_shndx
   1723 	  && isym->st_value > addr
   1724 	  && isym->st_value < toaddr)
   1725 	isym->st_value -= count;
   1726 
   1727       /* If the symbol *spans* the bytes we just deleted (i.e. it's
   1728 	 *end* is in the moved bytes but it's *start* isn't), then we
   1729 	 must adjust its size.  */
   1730       if (isym->st_shndx == sec_shndx
   1731 	  && isym->st_value < addr
   1732 	  && isym->st_value + isym->st_size > addr
   1733 	  && isym->st_value + isym->st_size < toaddr)
   1734 	isym->st_size -= count;
   1735     }
   1736 
   1737   /* Now adjust the global symbols defined in this section.  */
   1738   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
   1739 	      - symtab_hdr->sh_info);
   1740   sym_hashes = elf_sym_hashes (abfd);
   1741   end_hashes = sym_hashes + symcount;
   1742 
   1743   for (; sym_hashes < end_hashes; sym_hashes++)
   1744     {
   1745       struct elf_link_hash_entry *sym_hash = *sym_hashes;
   1746 
   1747       if ((sym_hash->root.type == bfd_link_hash_defined
   1748 	   || sym_hash->root.type == bfd_link_hash_defweak)
   1749 	  && sym_hash->root.u.def.section == sec)
   1750 	{
   1751 	  /* As above, adjust the value if needed.  */
   1752 	  if (sym_hash->root.u.def.value > addr
   1753 	      && sym_hash->root.u.def.value < toaddr)
   1754 	    sym_hash->root.u.def.value -= count;
   1755 
   1756 	  /* As above, adjust the size if needed.  */
   1757 	  if (sym_hash->root.u.def.value < addr
   1758 	      && sym_hash->root.u.def.value + sym_hash->size > addr
   1759 	      && sym_hash->root.u.def.value + sym_hash->size < toaddr)
   1760 	    sym_hash->size -= count;
   1761 	}
   1762     }
   1763 
   1764   return TRUE;
   1765 }
   1766 
   1767 /* Used to sort relocs by address.  If relocs have the same address,
   1768    we maintain their relative order, except that R_RL78_RH_RELAX
   1769    alignment relocs must be the first reloc for any given address.  */
   1770 
   1771 static void
   1772 reloc_bubblesort (Elf_Internal_Rela * r, int count)
   1773 {
   1774   int i;
   1775   bfd_boolean again;
   1776   bfd_boolean swappit;
   1777 
   1778   /* This is almost a classic bubblesort.  It's the slowest sort, but
   1779      we're taking advantage of the fact that the relocations are
   1780      mostly in order already (the assembler emits them that way) and
   1781      we need relocs with the same address to remain in the same
   1782      relative order.  */
   1783   again = TRUE;
   1784   while (again)
   1785     {
   1786       again = FALSE;
   1787       for (i = 0; i < count - 1; i ++)
   1788 	{
   1789 	  if (r[i].r_offset > r[i + 1].r_offset)
   1790 	    swappit = TRUE;
   1791 	  else if (r[i].r_offset < r[i + 1].r_offset)
   1792 	    swappit = FALSE;
   1793 	  else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
   1794 		   && (r[i + 1].r_addend & RL78_RELAXA_ALIGN))
   1795 	    swappit = TRUE;
   1796 	  else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
   1797 		   && (r[i + 1].r_addend & RL78_RELAXA_ELIGN)
   1798 		   && !(ELF32_R_TYPE (r[i].r_info) == R_RL78_RH_RELAX
   1799 			&& (r[i].r_addend & RL78_RELAXA_ALIGN)))
   1800 	    swappit = TRUE;
   1801 	  else
   1802 	    swappit = FALSE;
   1803 
   1804 	  if (swappit)
   1805 	    {
   1806 	      Elf_Internal_Rela tmp;
   1807 
   1808 	      tmp = r[i];
   1809 	      r[i] = r[i + 1];
   1810 	      r[i + 1] = tmp;
   1811 	      /* If we do move a reloc back, re-scan to see if it
   1812 		 needs to be moved even further back.  This avoids
   1813 		 most of the O(n^2) behavior for our cases.  */
   1814 	      if (i > 0)
   1815 		i -= 2;
   1816 	      again = TRUE;
   1817 	    }
   1818 	}
   1819     }
   1820 }
   1821 
   1822 
   1823 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
   1824   rl78_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
   1825 			 lrel, abfd, sec, link_info, scale)
   1826 
   1827 static bfd_vma
   1828 rl78_offset_for_reloc (bfd *                    abfd,
   1829 		       Elf_Internal_Rela *      rel,
   1830 		       Elf_Internal_Shdr *      symtab_hdr,
   1831 		       Elf_External_Sym_Shndx * shndx_buf ATTRIBUTE_UNUSED,
   1832 		       Elf_Internal_Sym *       intsyms,
   1833 		       Elf_Internal_Rela **     lrel,
   1834 		       bfd *                    input_bfd,
   1835 		       asection *               input_section,
   1836 		       struct bfd_link_info *   info,
   1837 		       int *                    scale)
   1838 {
   1839   bfd_vma symval;
   1840 
   1841   *scale = 1;
   1842 
   1843   /* REL is the first of 1..N relocations.  We compute the symbol
   1844      value for each relocation, then combine them if needed.  LREL
   1845      gets a pointer to the last relocation used.  */
   1846   while (1)
   1847     {
   1848       unsigned long r_type;
   1849 
   1850       /* Get the value of the symbol referred to by the reloc.  */
   1851       if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
   1852 	{
   1853 	  /* A local symbol.  */
   1854 	  Elf_Internal_Sym *isym;
   1855 	  asection *ssec;
   1856 
   1857 	  isym = intsyms + ELF32_R_SYM (rel->r_info);
   1858 
   1859 	  if (isym->st_shndx == SHN_UNDEF)
   1860 	    ssec = bfd_und_section_ptr;
   1861 	  else if (isym->st_shndx == SHN_ABS)
   1862 	    ssec = bfd_abs_section_ptr;
   1863 	  else if (isym->st_shndx == SHN_COMMON)
   1864 	    ssec = bfd_com_section_ptr;
   1865 	  else
   1866 	    ssec = bfd_section_from_elf_index (abfd,
   1867 					       isym->st_shndx);
   1868 
   1869 	  /* Initial symbol value.  */
   1870 	  symval = isym->st_value;
   1871 
   1872 	  /* GAS may have made this symbol relative to a section, in
   1873 	     which case, we have to add the addend to find the
   1874 	     symbol.  */
   1875 	  if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
   1876 	    symval += rel->r_addend;
   1877 
   1878 	  if (ssec)
   1879 	    {
   1880 	      if ((ssec->flags & SEC_MERGE)
   1881 		  && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
   1882 		symval = _bfd_merged_section_offset (abfd, & ssec,
   1883 						     elf_section_data (ssec)->sec_info,
   1884 						     symval);
   1885 	    }
   1886 
   1887 	  /* Now make the offset relative to where the linker is putting it.  */
   1888 	  if (ssec)
   1889 	    symval +=
   1890 	      ssec->output_section->vma + ssec->output_offset;
   1891 
   1892 	  symval += rel->r_addend;
   1893 	}
   1894       else
   1895 	{
   1896 	  unsigned long indx;
   1897 	  struct elf_link_hash_entry * h;
   1898 
   1899 	  /* An external symbol.  */
   1900 	  indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
   1901 	  h = elf_sym_hashes (abfd)[indx];
   1902 	  BFD_ASSERT (h != NULL);
   1903 
   1904 	  if (h->root.type != bfd_link_hash_defined
   1905 	      && h->root.type != bfd_link_hash_defweak)
   1906 	    {
   1907 	      /* This appears to be a reference to an undefined
   1908 		 symbol.  Just ignore it--it will be caught by the
   1909 		 regular reloc processing.  */
   1910 	      if (lrel)
   1911 		*lrel = rel;
   1912 	      return 0;
   1913 	    }
   1914 
   1915 	  symval = (h->root.u.def.value
   1916 		    + h->root.u.def.section->output_section->vma
   1917 		    + h->root.u.def.section->output_offset);
   1918 
   1919 	  symval += rel->r_addend;
   1920 	}
   1921 
   1922       r_type = ELF32_R_TYPE (rel->r_info);
   1923       switch (r_type)
   1924 	{
   1925 	case R_RL78_SYM:
   1926 	  (void) rl78_compute_complex_reloc (r_type, symval, input_section);
   1927 	  break;
   1928 
   1929 	case R_RL78_OPromtop:
   1930 	  symval = get_romstart (info, input_bfd, input_section, rel->r_offset);
   1931 	  (void) rl78_compute_complex_reloc (r_type, symval, input_section);
   1932 	  break;
   1933 
   1934 	case R_RL78_OPramtop:
   1935 	  symval = get_ramstart (info, input_bfd, input_section, rel->r_offset);
   1936 	  (void) rl78_compute_complex_reloc (r_type, symval, input_section);
   1937 	  break;
   1938 
   1939 	case R_RL78_OPneg:
   1940 	case R_RL78_OPadd:
   1941 	case R_RL78_OPsub:
   1942 	case R_RL78_OPmul:
   1943 	case R_RL78_OPdiv:
   1944 	case R_RL78_OPshla:
   1945 	case R_RL78_OPshra:
   1946 	case R_RL78_OPsctsize:
   1947 	case R_RL78_OPscttop:
   1948 	case R_RL78_OPand:
   1949 	case R_RL78_OPor:
   1950 	case R_RL78_OPxor:
   1951 	case R_RL78_OPnot:
   1952 	case R_RL78_OPmod:
   1953 	  (void) rl78_compute_complex_reloc (r_type, 0, input_section);
   1954 	  break;
   1955 
   1956 	case R_RL78_DIR16UL:
   1957 	case R_RL78_DIR8UL:
   1958 	case R_RL78_ABS16UL:
   1959 	case R_RL78_ABS8UL:
   1960 	  *scale = 4;
   1961 	  goto reloc_computes_value;
   1962 
   1963 	case R_RL78_DIR16UW:
   1964 	case R_RL78_DIR8UW:
   1965 	case R_RL78_ABS16UW:
   1966 	case R_RL78_ABS8UW:
   1967 	  *scale = 2;
   1968 	  goto reloc_computes_value;
   1969 
   1970 	default:
   1971 	reloc_computes_value:
   1972 	  symval = rl78_compute_complex_reloc (r_type, symval, input_section);
   1973 	  /* Fall through.  */
   1974 	case R_RL78_DIR32:
   1975 	case R_RL78_DIR24S:
   1976 	case R_RL78_DIR16:
   1977 	case R_RL78_DIR16U:
   1978 	case R_RL78_DIR16S:
   1979 	case R_RL78_DIR24S_PCREL:
   1980 	case R_RL78_DIR16S_PCREL:
   1981 	case R_RL78_DIR8S_PCREL:
   1982 	  if (lrel)
   1983 	    *lrel = rel;
   1984 	  return symval;
   1985 	}
   1986 
   1987       rel ++;
   1988     }
   1989 }
   1990 
   1991 struct {
   1992   int prefix;		/* or -1 for "no prefix" */
   1993   int insn;		/* or -1 for "end of list" */
   1994   int insn_for_saddr;	/* or -1 for "no alternative" */
   1995   int insn_for_sfr;	/* or -1 for "no alternative" */
   1996 } relax_addr16[] = {
   1997   { -1, 0x02, 0x06, -1 },	/* ADDW	AX, !addr16 */
   1998   { -1, 0x22, 0x26, -1 },	/* SUBW	AX, !addr16 */
   1999   { -1, 0x42, 0x46, -1 },	/* CMPW	AX, !addr16 */
   2000   { -1, 0x40, 0x4a, -1 },	/* CMP	!addr16, #byte */
   2001 
   2002   { -1, 0x0f, 0x0b, -1 },	/* ADD	A, !addr16 */
   2003   { -1, 0x1f, 0x1b, -1 },	/* ADDC	A, !addr16 */
   2004   { -1, 0x2f, 0x2b, -1 },	/* SUB	A, !addr16 */
   2005   { -1, 0x3f, 0x3b, -1 },	/* SUBC	A, !addr16 */
   2006   { -1, 0x4f, 0x4b, -1 },	/* CMP	A, !addr16 */
   2007   { -1, 0x5f, 0x5b, -1 },	/* AND	A, !addr16 */
   2008   { -1, 0x6f, 0x6b, -1 },	/* OR	A, !addr16 */
   2009   { -1, 0x7f, 0x7b, -1 },	/* XOR	A, !addr16 */
   2010 
   2011   { -1, 0x8f, 0x8d, 0x8e },	/* MOV	A, !addr16 */
   2012   { -1, 0x9f, 0x9d, 0x9e },	/* MOV	!addr16, A */
   2013   { -1, 0xaf, 0xad, 0xae },	/* MOVW	AX, !addr16 */
   2014   { -1, 0xbf, 0xbd, 0xbe },	/* MOVW	!addr16, AX */
   2015   { -1, 0xcf, 0xcd, 0xce },	/* MOVW	!addr16, #word */
   2016 
   2017   { -1, 0xa0, 0xa4, -1 },	/* INC	!addr16 */
   2018   { -1, 0xa2, 0xa6, -1 },	/* INCW	!addr16 */
   2019   { -1, 0xb0, 0xb4, -1 },	/* DEC	!addr16 */
   2020   { -1, 0xb2, 0xb6, -1 },	/* DECW	!addr16 */
   2021 
   2022   { -1, 0xd5, 0xd4, -1 },	/* CMP0	!addr16 */
   2023   { -1, 0xe5, 0xe4, -1 },	/* ONEB	!addr16 */
   2024   { -1, 0xf5, 0xf4, -1 },	/* CLRB	!addr16 */
   2025 
   2026   { -1, 0xd9, 0xd8, -1 },	/* MOV	X, !addr16 */
   2027   { -1, 0xe9, 0xe8, -1 },	/* MOV	B, !addr16 */
   2028   { -1, 0xf9, 0xf8, -1 },	/* MOV	C, !addr16 */
   2029   { -1, 0xdb, 0xda, -1 },	/* MOVW	BC, !addr16 */
   2030   { -1, 0xeb, 0xea, -1 },	/* MOVW	DE, !addr16 */
   2031   { -1, 0xfb, 0xfa, -1 },	/* MOVW	HL, !addr16 */
   2032 
   2033   { 0x61, 0xaa, 0xa8, -1 },	/* XCH	A, !addr16 */
   2034 
   2035   { 0x71, 0x00, 0x02, 0x0a },	/* SET1	!addr16.0 */
   2036   { 0x71, 0x10, 0x12, 0x1a },	/* SET1	!addr16.0 */
   2037   { 0x71, 0x20, 0x22, 0x2a },	/* SET1	!addr16.0 */
   2038   { 0x71, 0x30, 0x32, 0x3a },	/* SET1	!addr16.0 */
   2039   { 0x71, 0x40, 0x42, 0x4a },	/* SET1	!addr16.0 */
   2040   { 0x71, 0x50, 0x52, 0x5a },	/* SET1	!addr16.0 */
   2041   { 0x71, 0x60, 0x62, 0x6a },	/* SET1	!addr16.0 */
   2042   { 0x71, 0x70, 0x72, 0x7a },	/* SET1	!addr16.0 */
   2043 
   2044   { 0x71, 0x08, 0x03, 0x0b },	/* CLR1	!addr16.0 */
   2045   { 0x71, 0x18, 0x13, 0x1b },	/* CLR1	!addr16.0 */
   2046   { 0x71, 0x28, 0x23, 0x2b },	/* CLR1	!addr16.0 */
   2047   { 0x71, 0x38, 0x33, 0x3b },	/* CLR1	!addr16.0 */
   2048   { 0x71, 0x48, 0x43, 0x4b },	/* CLR1	!addr16.0 */
   2049   { 0x71, 0x58, 0x53, 0x5b },	/* CLR1	!addr16.0 */
   2050   { 0x71, 0x68, 0x63, 0x6b },	/* CLR1	!addr16.0 */
   2051   { 0x71, 0x78, 0x73, 0x7b },	/* CLR1	!addr16.0 */
   2052 
   2053   { -1, -1, -1, -1 }
   2054 };
   2055 
   2056 /* Relax one section.  */
   2057 
   2058 static bfd_boolean
   2059 rl78_elf_relax_section
   2060     (bfd *                  abfd,
   2061      asection *             sec,
   2062      struct bfd_link_info * link_info,
   2063      bfd_boolean *          again)
   2064 {
   2065   Elf_Internal_Shdr * symtab_hdr;
   2066   Elf_Internal_Shdr * shndx_hdr;
   2067   Elf_Internal_Rela * internal_relocs;
   2068   Elf_Internal_Rela * free_relocs = NULL;
   2069   Elf_Internal_Rela * irel;
   2070   Elf_Internal_Rela * srel;
   2071   Elf_Internal_Rela * irelend;
   2072   Elf_Internal_Rela * next_alignment;
   2073   bfd_byte *          contents = NULL;
   2074   bfd_byte *          free_contents = NULL;
   2075   Elf_Internal_Sym *  intsyms = NULL;
   2076   Elf_Internal_Sym *  free_intsyms = NULL;
   2077   Elf_External_Sym_Shndx * shndx_buf = NULL;
   2078   bfd_vma pc;
   2079   bfd_vma symval ATTRIBUTE_UNUSED = 0;
   2080   int pcrel ATTRIBUTE_UNUSED = 0;
   2081   int code ATTRIBUTE_UNUSED = 0;
   2082   int section_alignment_glue;
   2083   int scale;
   2084 
   2085   if (abfd == elf_hash_table (link_info)->dynobj
   2086       && strcmp (sec->name, ".plt") == 0)
   2087     return rl78_elf_relax_plt_section (abfd, sec, link_info, again);
   2088 
   2089   /* Assume nothing changes.  */
   2090   *again = FALSE;
   2091 
   2092   /* We don't have to do anything for a relocatable link, if
   2093      this section does not have relocs, or if this is not a
   2094      code section.  */
   2095   if (bfd_link_relocatable (link_info)
   2096       || (sec->flags & SEC_RELOC) == 0
   2097       || sec->reloc_count == 0
   2098       || (sec->flags & SEC_CODE) == 0)
   2099     return TRUE;
   2100 
   2101   symtab_hdr = & elf_symtab_hdr (abfd);
   2102   if (elf_symtab_shndx_list (abfd))
   2103     shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
   2104   else
   2105     shndx_hdr = NULL;
   2106 
   2107   /* Get the section contents.  */
   2108   if (elf_section_data (sec)->this_hdr.contents != NULL)
   2109     contents = elf_section_data (sec)->this_hdr.contents;
   2110   /* Go get them off disk.  */
   2111   else
   2112     {
   2113       if (! bfd_malloc_and_get_section (abfd, sec, &contents))
   2114 	goto error_return;
   2115       elf_section_data (sec)->this_hdr.contents = contents;
   2116     }
   2117 
   2118   /* Read this BFD's symbols.  */
   2119   /* Get cached copy if it exists.  */
   2120   if (symtab_hdr->contents != NULL)
   2121     intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
   2122   else
   2123     {
   2124       intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
   2125       symtab_hdr->contents = (bfd_byte *) intsyms;
   2126     }
   2127 
   2128   if (shndx_hdr && shndx_hdr->sh_size != 0)
   2129     {
   2130       bfd_size_type amt;
   2131 
   2132       amt = symtab_hdr->sh_info;
   2133       amt *= sizeof (Elf_External_Sym_Shndx);
   2134       shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
   2135       if (shndx_buf == NULL)
   2136 	goto error_return;
   2137       if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
   2138 	  || bfd_bread (shndx_buf, amt, abfd) != amt)
   2139 	goto error_return;
   2140       shndx_hdr->contents = (bfd_byte *) shndx_buf;
   2141     }
   2142 
   2143   /* Get a copy of the native relocations.  */
   2144   internal_relocs = (_bfd_elf_link_read_relocs
   2145 		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
   2146 		      link_info->keep_memory));
   2147   if (internal_relocs == NULL)
   2148     goto error_return;
   2149   if (! link_info->keep_memory)
   2150     free_relocs = internal_relocs;
   2151 
   2152   /* The RL_ relocs must be just before the operand relocs they go
   2153      with, so we must sort them to guarantee this.  We use bubblesort
   2154      instead of qsort so we can guarantee that relocs with the same
   2155      address remain in the same relative order.  */
   2156   reloc_bubblesort (internal_relocs, sec->reloc_count);
   2157 
   2158   /* Walk through them looking for relaxing opportunities.  */
   2159   irelend = internal_relocs + sec->reloc_count;
   2160 
   2161 
   2162   /* This will either be NULL or a pointer to the next alignment
   2163      relocation.  */
   2164   next_alignment = internal_relocs;
   2165 
   2166   /* We calculate worst case shrinkage caused by alignment directives.
   2167      No fool-proof, but better than either ignoring the problem or
   2168      doing heavy duty analysis of all the alignment markers in all
   2169      input sections.  */
   2170   section_alignment_glue = 0;
   2171   for (irel = internal_relocs; irel < irelend; irel++)
   2172       if (ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
   2173 	  && irel->r_addend & RL78_RELAXA_ALIGN)
   2174 	{
   2175 	  int this_glue = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
   2176 
   2177 	  if (section_alignment_glue < this_glue)
   2178 	    section_alignment_glue = this_glue;
   2179 	}
   2180   /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
   2181      shrinkage.  */
   2182   section_alignment_glue *= 2;
   2183 
   2184   for (irel = internal_relocs; irel < irelend; irel++)
   2185     {
   2186       unsigned char *insn;
   2187       int nrelocs;
   2188 
   2189       /* The insns we care about are all marked with one of these.  */
   2190       if (ELF32_R_TYPE (irel->r_info) != R_RL78_RH_RELAX)
   2191 	continue;
   2192 
   2193       if (irel->r_addend & RL78_RELAXA_ALIGN
   2194 	  || next_alignment == internal_relocs)
   2195 	{
   2196 	  /* When we delete bytes, we need to maintain all the alignments
   2197 	     indicated.  In addition, we need to be careful about relaxing
   2198 	     jumps across alignment boundaries - these displacements
   2199 	     *grow* when we delete bytes.  For now, don't shrink
   2200 	     displacements across an alignment boundary, just in case.
   2201 	     Note that this only affects relocations to the same
   2202 	     section.  */
   2203 	  next_alignment += 2;
   2204 	  while (next_alignment < irelend
   2205 		 && (ELF32_R_TYPE (next_alignment->r_info) != R_RL78_RH_RELAX
   2206 		     || !(next_alignment->r_addend & RL78_RELAXA_ELIGN)))
   2207 	    next_alignment ++;
   2208 	  if (next_alignment >= irelend || next_alignment->r_offset == 0)
   2209 	    next_alignment = NULL;
   2210 	}
   2211 
   2212       /* When we hit alignment markers, see if we've shrunk enough
   2213 	 before them to reduce the gap without violating the alignment
   2214 	 requirements.  */
   2215       if (irel->r_addend & RL78_RELAXA_ALIGN)
   2216 	{
   2217 	  /* At this point, the next relocation *should* be the ELIGN
   2218 	     end marker.  */
   2219 	  Elf_Internal_Rela *erel = irel + 1;
   2220 	  unsigned int alignment, nbytes;
   2221 
   2222 	  if (ELF32_R_TYPE (erel->r_info) != R_RL78_RH_RELAX)
   2223 	    continue;
   2224 	  if (!(erel->r_addend & RL78_RELAXA_ELIGN))
   2225 	    continue;
   2226 
   2227 	  alignment = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
   2228 
   2229 	  if (erel->r_offset - irel->r_offset < alignment)
   2230 	    continue;
   2231 
   2232 	  nbytes = erel->r_offset - irel->r_offset;
   2233 	  nbytes /= alignment;
   2234 	  nbytes *= alignment;
   2235 
   2236 	  elf32_rl78_relax_delete_bytes (abfd, sec, erel->r_offset - nbytes, nbytes,
   2237 					 next_alignment, erel->r_offset == sec->size);
   2238 	  *again = TRUE;
   2239 
   2240 	  continue;
   2241 	}
   2242 
   2243       if (irel->r_addend & RL78_RELAXA_ELIGN)
   2244 	  continue;
   2245 
   2246       insn = contents + irel->r_offset;
   2247 
   2248       nrelocs = irel->r_addend & RL78_RELAXA_RNUM;
   2249 
   2250       /* At this point, we have an insn that is a candidate for linker
   2251 	 relaxation.  There are NRELOCS relocs following that may be
   2252 	 relaxed, although each reloc may be made of more than one
   2253 	 reloc entry (such as gp-rel symbols).  */
   2254 
   2255       /* Get the value of the symbol referred to by the reloc.  Just
   2256          in case this is the last reloc in the list, use the RL's
   2257          addend to choose between this reloc (no addend) or the next
   2258          (yes addend, which means at least one following reloc).  */
   2259 
   2260       /* srel points to the "current" reloction for this insn -
   2261 	 actually the last reloc for a given operand, which is the one
   2262 	 we need to update.  We check the relaxations in the same
   2263 	 order that the relocations happen, so we'll just push it
   2264 	 along as we go.  */
   2265       srel = irel;
   2266 
   2267       pc = sec->output_section->vma + sec->output_offset
   2268 	+ srel->r_offset;
   2269 
   2270 #define GET_RELOC					\
   2271       BFD_ASSERT (nrelocs > 0);				\
   2272       symval = OFFSET_FOR_RELOC (srel, &srel, &scale);	\
   2273       pcrel = symval - pc + srel->r_addend;		\
   2274       nrelocs --;
   2275 
   2276 #define SNIPNR(offset, nbytes) \
   2277 	elf32_rl78_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0);
   2278 
   2279 #define SNIP(offset, nbytes, newtype)					\
   2280         SNIPNR (offset, nbytes);					\
   2281 	srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
   2282 
   2283       /* The order of these bit tests must match the order that the
   2284 	 relocs appear in.  Since we sorted those by offset, we can
   2285 	 predict them.  */
   2286 
   2287       /*----------------------------------------------------------------------*/
   2288       /* EF ad		BR $rel8	pcrel
   2289 	 ED al ah	BR !abs16	abs
   2290 	 EE al ah	BR $!rel16	pcrel
   2291 	 EC al ah as	BR !!abs20	abs
   2292 
   2293 	 FD al ah	CALL !abs16	abs
   2294 	 FE al ah	CALL $!rel16	pcrel
   2295 	 FC al ah as	CALL !!abs20	abs
   2296 
   2297 	 DC ad		BC  $rel8
   2298 	 DE ad		BNC $rel8
   2299 	 DD ad		BZ  $rel8
   2300 	 DF ad		BNZ $rel8
   2301 	 61 C3 ad	BH  $rel8
   2302 	 61 D3 ad	BNH $rel8
   2303 	 61 C8 EF ad	SKC  ; BR $rel8
   2304 	 61 D8 EF ad	SKNC ; BR $rel8
   2305 	 61 E8 EF ad	SKZ  ; BR $rel8
   2306 	 61 F8 EF ad	SKNZ ; BR $rel8
   2307 	 61 E3 EF ad	SKH  ; BR $rel8
   2308 	 61 F3 EF ad	SKNH ; BR $rel8
   2309        */
   2310 
   2311       if ((irel->r_addend & RL78_RELAXA_MASK) == RL78_RELAXA_BRA)
   2312 	{
   2313 	  /* SKIP opcodes that skip non-branches will have a relax tag
   2314 	     but no corresponding symbol to relax against; we just
   2315 	     skip those.  */
   2316 	  if (irel->r_addend & RL78_RELAXA_RNUM)
   2317 	    {
   2318 	      GET_RELOC;
   2319 	    }
   2320 
   2321 	  switch (insn[0])
   2322 	    {
   2323 	    case 0xdc: /* BC */
   2324 	    case 0xdd: /* BZ */
   2325 	    case 0xde: /* BNC */
   2326 	    case 0xdf: /* BNZ */
   2327 	      if (insn[1] == 0x03 && insn[2] == 0xee /* BR */
   2328 		  && (srel->r_offset - irel->r_offset) > 1) /* a B<c> without its own reloc */
   2329 		{
   2330 		  /* This is a "long" conditional as generated by gas:
   2331 		     DC 03 EE ad.dr  */
   2332 		  if (pcrel < 127
   2333 		      && pcrel > -127)
   2334 		    {
   2335 		      insn[0] ^= 0x02; /* invert conditional */
   2336 		      SNIPNR (4, 1);
   2337 		      SNIP (1, 2, R_RL78_DIR8S_PCREL);
   2338 		      insn[1] = pcrel;
   2339 		      *again = TRUE;
   2340 		    }
   2341 		}
   2342 	      break;
   2343 
   2344 	    case 0xec: /* BR !!abs20 */
   2345 
   2346 	      if (pcrel < 127
   2347 		  && pcrel > -127)
   2348 		{
   2349 		  insn[0] = 0xef;
   2350 		  insn[1] = pcrel;
   2351 		  SNIP (2, 2, R_RL78_DIR8S_PCREL);
   2352 		  *again = TRUE;
   2353 		}
   2354 	      else if (symval < 65536)
   2355 		{
   2356 		  insn[0] = 0xed;
   2357 		  insn[1] = symval & 0xff;
   2358 		  insn[2] = symval >> 8;
   2359 		  SNIP (2, 1, R_RL78_DIR16U);
   2360 		  *again = TRUE;
   2361 		}
   2362 	      else if (pcrel < 32767
   2363 		       && pcrel > -32767)
   2364 		{
   2365 		  insn[0] = 0xee;
   2366 		  insn[1] = pcrel & 0xff;
   2367 		  insn[2] = pcrel >> 8;
   2368 		  SNIP (2, 1, R_RL78_DIR16S_PCREL);
   2369 		  *again = TRUE;
   2370 		}
   2371 	      break;
   2372 
   2373 	    case 0xee: /* BR $!pcrel16 */
   2374 	    case 0xed: /* BR $!abs16 */
   2375 	      if (pcrel < 127
   2376 		  && pcrel > -127)
   2377 		{
   2378 		  insn[0] = 0xef;
   2379 		  insn[1] = pcrel;
   2380 		  SNIP (2, 1, R_RL78_DIR8S_PCREL);
   2381 		  *again = TRUE;
   2382 		}
   2383 	      break;
   2384 
   2385 	    case 0xfc: /* CALL !!abs20 */
   2386 	      if (symval < 65536)
   2387 		{
   2388 		  insn[0] = 0xfd;
   2389 		  insn[1] = symval & 0xff;
   2390 		  insn[2] = symval >> 8;
   2391 		  SNIP (2, 1, R_RL78_DIR16U);
   2392 		  *again = TRUE;
   2393 		}
   2394 	      else if (pcrel < 32767
   2395 		       && pcrel > -32767)
   2396 		{
   2397 		  insn[0] = 0xfe;
   2398 		  insn[1] = pcrel & 0xff;
   2399 		  insn[2] = pcrel >> 8;
   2400 		  SNIP (2, 1, R_RL78_DIR16S_PCREL);
   2401 		  *again = TRUE;
   2402 		}
   2403 	      break;
   2404 
   2405 	    case 0x61: /* PREFIX */
   2406 	      /* For SKIP/BR, we change the BR opcode and delete the
   2407 		 SKIP.  That way, we don't have to find and change the
   2408 		 relocation for the BR.  */
   2409 	      /* Note that, for the case where we're skipping some
   2410 		 other insn, we have no "other" reloc but that's safe
   2411 		 here anyway. */
   2412 	      switch (insn[1])
   2413 		{
   2414 		case 0xd3: /* BNH */
   2415 		case 0xc3: /* BH */
   2416 		  if (insn[2] == 0x03 && insn[3] == 0xee
   2417 		      && (srel->r_offset - irel->r_offset) > 2) /* a B<c> without its own reloc */
   2418 		    {
   2419 		      /* Another long branch by gas:
   2420 			 61 D3 03 EE ad.dr  */
   2421 		      if (pcrel < 127
   2422 			  && pcrel > -127)
   2423 			{
   2424 			  insn[1] ^= 0x10; /* invert conditional */
   2425 			  SNIPNR (5, 1);
   2426 			  SNIP (2, 2, R_RL78_DIR8S_PCREL);
   2427 			  insn[2] = pcrel;
   2428 			  *again = TRUE;
   2429 			}
   2430 		    }
   2431 		  break;
   2432 
   2433 		case 0xc8: /* SKC */
   2434 		  if (insn[2] == 0xef)
   2435 		    {
   2436 		      insn[2] = 0xde; /* BNC */
   2437 		      SNIPNR (0, 2);
   2438 		    }
   2439 		  break;
   2440 
   2441 		case 0xd8: /* SKNC */
   2442 		  if (insn[2] == 0xef)
   2443 		    {
   2444 		      insn[2] = 0xdc; /* BC */
   2445 		      SNIPNR (0, 2);
   2446 		    }
   2447 		  break;
   2448 
   2449 		case 0xe8: /* SKZ */
   2450 		  if (insn[2] == 0xef)
   2451 		    {
   2452 		      insn[2] = 0xdf; /* BNZ */
   2453 		      SNIPNR (0, 2);
   2454 		    }
   2455 		  break;
   2456 
   2457 		case 0xf8: /* SKNZ */
   2458 		  if (insn[2] == 0xef)
   2459 		    {
   2460 		      insn[2] = 0xdd; /* BZ */
   2461 		      SNIPNR (0, 2);
   2462 		    }
   2463 		  break;
   2464 
   2465 		case 0xe3: /* SKH */
   2466 		  if (insn[2] == 0xef)
   2467 		    {
   2468 		      insn[2] = 0xd3; /* BNH */
   2469 		      SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
   2470 		    }
   2471 		  break;
   2472 
   2473 		case 0xf3: /* SKNH */
   2474 		  if (insn[2] == 0xef)
   2475 		    {
   2476 		      insn[2] = 0xc3; /* BH */
   2477 		      SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
   2478 		    }
   2479 		  break;
   2480 		}
   2481 	      break;
   2482 	    }
   2483 	}
   2484 
   2485       if ((irel->r_addend &  RL78_RELAXA_MASK) == RL78_RELAXA_ADDR16
   2486           && nrelocs > 0)
   2487 	{
   2488 	  /*----------------------------------------------------------------------*/
   2489 	  /* Some insns have both a 16-bit address operand and an 8-bit
   2490 	     variant if the address is within a special range:
   2491 
   2492 	     Address		16-bit operand	SADDR range	SFR range
   2493 	     FFF00-FFFFF	0xff00-0xffff	0x00-0xff
   2494 	     FFE20-FFF1F	0xfe20-0xff1f	 		0x00-0xff
   2495 
   2496 	     The RELAX_ADDR16[] array has the insn encodings for the
   2497 	     16-bit operand version, as well as the SFR and SADDR
   2498 	     variants.  We only need to replace the encodings and
   2499 	     adjust the operand.
   2500 
   2501 	     Note: we intentionally do not attempt to decode and skip
   2502 	     any ES: prefix, as adding ES: means the addr16 (likely)
   2503 	     no longer points to saddr/sfr space.
   2504 	  */
   2505 
   2506 	  int is_sfr;
   2507 	  int is_saddr;
   2508 	  int idx;
   2509 	  int poff;
   2510 
   2511 	  GET_RELOC;
   2512 
   2513 	  if (0xffe20 <= symval && symval <= 0xfffff)
   2514 	    {
   2515 
   2516 	      is_saddr = (0xffe20 <= symval && symval <= 0xfff1f);
   2517 	      is_sfr   = (0xfff00 <= symval && symval <= 0xfffff);
   2518 
   2519 	      for (idx = 0; relax_addr16[idx].insn != -1; idx ++)
   2520 		{
   2521 		  if (relax_addr16[idx].prefix != -1
   2522 		      && insn[0] == relax_addr16[idx].prefix
   2523 		      && insn[1] == relax_addr16[idx].insn)
   2524 		    {
   2525 		      poff = 1;
   2526 		    }
   2527 		  else if (relax_addr16[idx].prefix == -1
   2528 			   && insn[0] == relax_addr16[idx].insn)
   2529 		    {
   2530 		      poff = 0;
   2531 		    }
   2532 		  else
   2533 		    continue;
   2534 
   2535 		  /* We have a matched insn, and poff is 0 or 1 depending
   2536 		     on the base pattern size.  */
   2537 
   2538 		  if (is_sfr && relax_addr16[idx].insn_for_sfr != -1)
   2539 		    {
   2540 		      insn[poff] = relax_addr16[idx].insn_for_sfr;
   2541 		      SNIP (poff+2, 1, R_RL78_RH_SFR);
   2542 		    }
   2543 
   2544 		  else if  (is_saddr && relax_addr16[idx].insn_for_saddr != -1)
   2545 		    {
   2546 		      insn[poff] = relax_addr16[idx].insn_for_saddr;
   2547 		      SNIP (poff+2, 1, R_RL78_RH_SADDR);
   2548 		    }
   2549 		}
   2550 	    }
   2551 	}
   2552       /*----------------------------------------------------------------------*/
   2553     }
   2554 
   2555   return TRUE;
   2556 
   2557  error_return:
   2558   if (free_relocs != NULL)
   2559     free (free_relocs);
   2560 
   2561   if (free_contents != NULL)
   2562     free (free_contents);
   2563 
   2564   if (shndx_buf != NULL)
   2565     {
   2566       shndx_hdr->contents = NULL;
   2567       free (shndx_buf);
   2568     }
   2569 
   2570   if (free_intsyms != NULL)
   2571     free (free_intsyms);
   2572 
   2573   return TRUE;
   2574 }
   2575 
   2576 
   2577 
   2579 #define ELF_ARCH		bfd_arch_rl78
   2580 #define ELF_MACHINE_CODE	EM_RL78
   2581 #define ELF_MAXPAGESIZE		0x1000
   2582 
   2583 #define TARGET_LITTLE_SYM	rl78_elf32_vec
   2584 #define TARGET_LITTLE_NAME	"elf32-rl78"
   2585 
   2586 #define elf_info_to_howto_rel			NULL
   2587 #define elf_info_to_howto			rl78_info_to_howto_rela
   2588 #define elf_backend_object_p			rl78_elf_object_p
   2589 #define elf_backend_relocate_section		rl78_elf_relocate_section
   2590 #define elf_symbol_leading_char                 ('_')
   2591 #define elf_backend_can_gc_sections		1
   2592 
   2593 #define bfd_elf32_bfd_reloc_type_lookup		rl78_reloc_type_lookup
   2594 #define bfd_elf32_bfd_reloc_name_lookup		rl78_reloc_name_lookup
   2595 #define bfd_elf32_bfd_set_private_flags		rl78_elf_set_private_flags
   2596 #define bfd_elf32_bfd_merge_private_bfd_data	rl78_elf_merge_private_bfd_data
   2597 #define bfd_elf32_bfd_print_private_bfd_data	rl78_elf_print_private_bfd_data
   2598 
   2599 #define bfd_elf32_bfd_relax_section		rl78_elf_relax_section
   2600 #define elf_backend_check_relocs                rl78_elf_check_relocs
   2601 #define elf_backend_always_size_sections \
   2602   rl78_elf_always_size_sections
   2603 #define elf_backend_finish_dynamic_sections \
   2604   rl78_elf_finish_dynamic_sections
   2605 
   2606 #include "elf32-target.h"
   2607