unrecognized/unsupported reloc message
[external/binutils.git] / bfd / elf32-rl78.c
1 /* Renesas RL78 specific support for 32-bit ELF.
2    Copyright (C) 2011-2018 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., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20
21 #include "sysdep.h"
22 #include "bfd.h"
23 #include "bfd_stdint.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf/rl78.h"
27 #include "libiberty.h"
28
29 #define valid_16bit_address(v) ((v) <= 0x0ffff || (v) >= 0xf0000)
30
31 #define RL78REL(n,sz,bit,shift,complain,pcrel)                               \
32   HOWTO (R_RL78_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
33          bfd_elf_generic_reloc, "R_RL78_" #n, FALSE, 0, ~0, FALSE)
34
35 static bfd_reloc_status_type rl78_special_reloc (bfd *, arelent *, asymbol *, void *,
36                                                  asection *, bfd *, char **);
37
38 /* FIXME: We could omit the SHIFT parameter, it is always zero.  */
39 #define RL78_OP_REL(n,sz,bit,shift,complain,pcrel)                      \
40   HOWTO (R_RL78_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
41          rl78_special_reloc, "R_RL78_" #n, FALSE, 0, ~0, FALSE)
42
43 /* Note that the relocations around 0x7f are internal to this file;
44    feel free to move them as needed to avoid conflicts with published
45    relocation numbers.  */
46
47 static reloc_howto_type rl78_elf_howto_table [] =
48 {
49   RL78REL (NONE,         3,  0, 0, dont,     FALSE),
50   RL78REL (DIR32,        2, 32, 0, signed,   FALSE),
51   RL78REL (DIR24S,       2, 24, 0, signed,   FALSE),
52   RL78REL (DIR16,        1, 16, 0, dont,     FALSE),
53   RL78REL (DIR16U,       1, 16, 0, unsigned, FALSE),
54   RL78REL (DIR16S,       1, 16, 0, signed,   FALSE),
55   RL78REL (DIR8,         0,  8, 0, dont,     FALSE),
56   RL78REL (DIR8U,        0,  8, 0, unsigned, FALSE),
57   RL78REL (DIR8S,        0,  8, 0, signed,   FALSE),
58   RL78REL (DIR24S_PCREL, 2, 24, 0, signed,   TRUE),
59   RL78REL (DIR16S_PCREL, 1, 16, 0, signed,   TRUE),
60   RL78REL (DIR8S_PCREL,  0,  8, 0, signed,   TRUE),
61   RL78REL (DIR16UL,      1, 16, 2, unsigned, FALSE),
62   RL78REL (DIR16UW,      1, 16, 1, unsigned, FALSE),
63   RL78REL (DIR8UL,       0,  8, 2, unsigned, FALSE),
64   RL78REL (DIR8UW,       0,  8, 1, unsigned, FALSE),
65   RL78REL (DIR32_REV,    1, 16, 0, dont,     FALSE),
66   RL78REL (DIR16_REV,    1, 16, 0, dont,     FALSE),
67   RL78REL (DIR3U_PCREL,  0,  3, 0, dont,     TRUE),
68
69   EMPTY_HOWTO (0x13),
70   EMPTY_HOWTO (0x14),
71   EMPTY_HOWTO (0x15),
72   EMPTY_HOWTO (0x16),
73   EMPTY_HOWTO (0x17),
74   EMPTY_HOWTO (0x18),
75   EMPTY_HOWTO (0x19),
76   EMPTY_HOWTO (0x1a),
77   EMPTY_HOWTO (0x1b),
78   EMPTY_HOWTO (0x1c),
79   EMPTY_HOWTO (0x1d),
80   EMPTY_HOWTO (0x1e),
81   EMPTY_HOWTO (0x1f),
82
83   EMPTY_HOWTO (0x20),
84   EMPTY_HOWTO (0x21),
85   EMPTY_HOWTO (0x22),
86   EMPTY_HOWTO (0x23),
87   EMPTY_HOWTO (0x24),
88   EMPTY_HOWTO (0x25),
89   EMPTY_HOWTO (0x26),
90   EMPTY_HOWTO (0x27),
91   EMPTY_HOWTO (0x28),
92   EMPTY_HOWTO (0x29),
93   EMPTY_HOWTO (0x2a),
94   EMPTY_HOWTO (0x2b),
95   EMPTY_HOWTO (0x2c),
96   RL78REL (RH_RELAX, 0,  0, 0, dont,     FALSE),
97
98   EMPTY_HOWTO (0x2e),
99   RL78REL (RH_SADDR, 0,  0, 0, dont,     FALSE),
100   EMPTY_HOWTO (0x30),
101   EMPTY_HOWTO (0x31),
102   EMPTY_HOWTO (0x32),
103   EMPTY_HOWTO (0x33),
104   EMPTY_HOWTO (0x34),
105   EMPTY_HOWTO (0x35),
106   EMPTY_HOWTO (0x36),
107   EMPTY_HOWTO (0x37),
108   EMPTY_HOWTO (0x38),
109   EMPTY_HOWTO (0x39),
110   EMPTY_HOWTO (0x3a),
111   EMPTY_HOWTO (0x3b),
112   EMPTY_HOWTO (0x3c),
113   EMPTY_HOWTO (0x3d),
114   EMPTY_HOWTO (0x3e),
115   EMPTY_HOWTO (0x3f),
116   EMPTY_HOWTO (0x40),
117
118   RL78_OP_REL (ABS32,        2, 32, 0, dont,     FALSE),
119   RL78_OP_REL (ABS24S,       2, 24, 0, signed,   FALSE),
120   RL78_OP_REL (ABS16,        1, 16, 0, dont,     FALSE),
121   RL78_OP_REL (ABS16U,       1, 16, 0, unsigned, FALSE),
122   RL78_OP_REL (ABS16S,       1, 16, 0, signed,   FALSE),
123   RL78_OP_REL (ABS8,         0,  8, 0, dont,     FALSE),
124   RL78_OP_REL (ABS8U,        0,  8, 0, unsigned, FALSE),
125   RL78_OP_REL (ABS8S,        0,  8, 0, signed,   FALSE),
126   RL78_OP_REL (ABS24S_PCREL, 2, 24, 0, signed,   TRUE),
127   RL78_OP_REL (ABS16S_PCREL, 1, 16, 0, signed,   TRUE),
128   RL78_OP_REL (ABS8S_PCREL,  0,  8, 0, signed,   TRUE),
129   RL78_OP_REL (ABS16UL,      1, 16, 0, unsigned, FALSE),
130   RL78_OP_REL (ABS16UW,      1, 16, 0, unsigned, FALSE),
131   RL78_OP_REL (ABS8UL,       0,  8, 0, unsigned, FALSE),
132   RL78_OP_REL (ABS8UW,       0,  8, 0, unsigned, FALSE),
133   RL78_OP_REL (ABS32_REV,    2, 32, 0, dont,     FALSE),
134   RL78_OP_REL (ABS16_REV,    1, 16, 0, dont,     FALSE),
135
136 #define STACK_REL_P(x) ((x) <= R_RL78_ABS16_REV && (x) >= R_RL78_ABS32)
137
138   EMPTY_HOWTO (0x52),
139   EMPTY_HOWTO (0x53),
140   EMPTY_HOWTO (0x54),
141   EMPTY_HOWTO (0x55),
142   EMPTY_HOWTO (0x56),
143   EMPTY_HOWTO (0x57),
144   EMPTY_HOWTO (0x58),
145   EMPTY_HOWTO (0x59),
146   EMPTY_HOWTO (0x5a),
147   EMPTY_HOWTO (0x5b),
148   EMPTY_HOWTO (0x5c),
149   EMPTY_HOWTO (0x5d),
150   EMPTY_HOWTO (0x5e),
151   EMPTY_HOWTO (0x5f),
152   EMPTY_HOWTO (0x60),
153   EMPTY_HOWTO (0x61),
154   EMPTY_HOWTO (0x62),
155   EMPTY_HOWTO (0x63),
156   EMPTY_HOWTO (0x64),
157   EMPTY_HOWTO (0x65),
158   EMPTY_HOWTO (0x66),
159   EMPTY_HOWTO (0x67),
160   EMPTY_HOWTO (0x68),
161   EMPTY_HOWTO (0x69),
162   EMPTY_HOWTO (0x6a),
163   EMPTY_HOWTO (0x6b),
164   EMPTY_HOWTO (0x6c),
165   EMPTY_HOWTO (0x6d),
166   EMPTY_HOWTO (0x6e),
167   EMPTY_HOWTO (0x6f),
168   EMPTY_HOWTO (0x70),
169   EMPTY_HOWTO (0x71),
170   EMPTY_HOWTO (0x72),
171   EMPTY_HOWTO (0x73),
172   EMPTY_HOWTO (0x74),
173   EMPTY_HOWTO (0x75),
174   EMPTY_HOWTO (0x76),
175   EMPTY_HOWTO (0x77),
176
177   EMPTY_HOWTO (0x78),
178   EMPTY_HOWTO (0x79),
179   EMPTY_HOWTO (0x7a),
180   EMPTY_HOWTO (0x7b),
181   EMPTY_HOWTO (0x7c),
182   EMPTY_HOWTO (0x7d),
183   EMPTY_HOWTO (0x7e),
184   EMPTY_HOWTO (0x7f),
185
186   RL78_OP_REL (SYM,       2, 32, 0, dont, FALSE),
187   RL78_OP_REL (OPneg,     2, 32, 0, dont, FALSE),
188   RL78_OP_REL (OPadd,     2, 32, 0, dont, FALSE),
189   RL78_OP_REL (OPsub,     2, 32, 0, dont, FALSE),
190   RL78_OP_REL (OPmul,     2, 32, 0, dont, FALSE),
191   RL78_OP_REL (OPdiv,     2, 32, 0, dont, FALSE),
192   RL78_OP_REL (OPshla,    2, 32, 0, dont, FALSE),
193   RL78_OP_REL (OPshra,    2, 32, 0, dont, FALSE),
194   RL78_OP_REL (OPsctsize, 2, 32, 0, dont, FALSE),
195   EMPTY_HOWTO (0x89),
196   EMPTY_HOWTO (0x8a),
197   EMPTY_HOWTO (0x8b),
198   EMPTY_HOWTO (0x8c),
199   RL78_OP_REL (OPscttop,  2, 32, 0, dont, FALSE),
200   EMPTY_HOWTO (0x8e),
201   EMPTY_HOWTO (0x8f),
202   RL78_OP_REL (OPand,     2, 32, 0, dont, FALSE),
203   RL78_OP_REL (OPor,      2, 32, 0, dont, FALSE),
204   RL78_OP_REL (OPxor,     2, 32, 0, dont, FALSE),
205   RL78_OP_REL (OPnot,     2, 32, 0, dont, FALSE),
206   RL78_OP_REL (OPmod,     2, 32, 0, dont, FALSE),
207   RL78_OP_REL (OPromtop,  2, 32, 0, dont, FALSE),
208   RL78_OP_REL (OPramtop,  2, 32, 0, dont, FALSE)
209 };
210 \f
211 /* 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 (_("%pB: unsupported relocation type %#x"),
293                           abfd, r_type);
294       r_type = 0;
295     }
296   cache_ptr->howto = rl78_elf_howto_table + r_type;
297 }
298 \f
299 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 = _("%pB(%pA): 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 = _("%pB(%pA): 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 = _("%pB(%pA): internal error: out of range error");
1102               break;
1103
1104             case bfd_reloc_notsupported:
1105               /* xgettext:c-format */
1106               msg = _("%pB(%pA): internal error: unsupported relocation error");
1107               break;
1108
1109             case bfd_reloc_dangerous:
1110               /* xgettext:c-format */
1111               msg = _("%pB(%pA): internal error: dangerous relocation");
1112               break;
1113
1114             default:
1115               /* xgettext:c-format */
1116               msg = _("%pB(%pA): 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 \f
1128 /* Function to set the ELF flag bits.  */
1129
1130 static bfd_boolean
1131 rl78_elf_set_private_flags (bfd * abfd, flagword flags)
1132 {
1133   elf_elfheader (abfd)->e_flags = flags;
1134   elf_flags_init (abfd) = TRUE;
1135   return TRUE;
1136 }
1137
1138 static bfd_boolean no_warn_mismatch = FALSE;
1139
1140 void bfd_elf32_rl78_set_target_flags (bfd_boolean);
1141
1142 void
1143 bfd_elf32_rl78_set_target_flags (bfd_boolean user_no_warn_mismatch)
1144 {
1145   no_warn_mismatch = user_no_warn_mismatch;
1146 }
1147
1148 static const char *
1149 rl78_cpu_name (flagword flags)
1150 {
1151   switch (flags & E_FLAG_RL78_CPU_MASK)
1152     {
1153     default: return "";
1154     case E_FLAG_RL78_G10:     return "G10";
1155     case E_FLAG_RL78_G13:     return "G13";
1156     case E_FLAG_RL78_G14:     return "G14";
1157     }
1158 }
1159
1160 /* Merge backend specific data from an object file to the output
1161    object file when linking.  */
1162
1163 static bfd_boolean
1164 rl78_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
1165 {
1166   bfd *obfd = info->output_bfd;
1167   flagword new_flags;
1168   flagword old_flags;
1169   bfd_boolean error = FALSE;
1170
1171   new_flags = elf_elfheader (ibfd)->e_flags;
1172   old_flags = elf_elfheader (obfd)->e_flags;
1173
1174   if (!elf_flags_init (obfd))
1175     {
1176       /* First call, no flags set.  */
1177       elf_flags_init (obfd) = TRUE;
1178       elf_elfheader (obfd)->e_flags = new_flags;
1179     }
1180   else if (old_flags != new_flags)
1181     {
1182       flagword changed_flags = old_flags ^ new_flags;
1183
1184       if (changed_flags & E_FLAG_RL78_CPU_MASK)
1185         {
1186           flagword out_cpu = old_flags & E_FLAG_RL78_CPU_MASK;
1187           flagword in_cpu = new_flags & E_FLAG_RL78_CPU_MASK;
1188
1189           if (in_cpu == E_FLAG_RL78_ANY_CPU || in_cpu == out_cpu)
1190             /* It does not matter what new_cpu may have.  */;
1191           else if (out_cpu == E_FLAG_RL78_ANY_CPU)
1192             {
1193               if (in_cpu == E_FLAG_RL78_G10)
1194                 {
1195                   /* G10 files can only be linked with other G10 files.
1196                      If the output is set to "any" this means that it is
1197                      a G14 file that does not use hardware multiply/divide,
1198                      but that is still incompatible with the G10 ABI.  */
1199                   error = TRUE;
1200
1201                   _bfd_error_handler
1202                     /* xgettext:c-format */
1203                     (_("RL78 ABI conflict: G10 file %pB cannot be linked"
1204                        " with %s file %pB"),
1205                      ibfd, rl78_cpu_name (out_cpu), obfd);
1206                 }
1207               else
1208                 {
1209                   old_flags &= ~ E_FLAG_RL78_CPU_MASK;
1210                   old_flags |= in_cpu;
1211                   elf_elfheader (obfd)->e_flags = old_flags;
1212                 }
1213             }
1214           else
1215             {
1216               error = TRUE;
1217
1218               _bfd_error_handler
1219                 /* xgettext:c-format */
1220                 (_("RL78 ABI conflict: cannot link %s file %pB with %s file %pB"),
1221                  rl78_cpu_name (in_cpu),  ibfd,
1222                  rl78_cpu_name (out_cpu), obfd);
1223             }
1224         }
1225
1226       if (changed_flags & E_FLAG_RL78_64BIT_DOUBLES)
1227         {
1228           _bfd_error_handler
1229             (_("RL78 merge conflict: cannot link 32-bit and 64-bit objects together"));
1230
1231           if (old_flags & E_FLAG_RL78_64BIT_DOUBLES)
1232             /* xgettext:c-format */
1233             _bfd_error_handler (_("- %pB is 64-bit, %pB is not"),
1234                                 obfd, ibfd);
1235           else
1236             /* xgettext:c-format */
1237             _bfd_error_handler (_("- %pB is 64-bit, %pB is not"),
1238                                 ibfd, obfd);
1239           error = TRUE;
1240         }
1241     }
1242
1243   return !error;
1244 }
1245 \f
1246 static bfd_boolean
1247 rl78_elf_print_private_bfd_data (bfd * abfd, void * ptr)
1248 {
1249   FILE * file = (FILE *) ptr;
1250   flagword flags;
1251
1252   BFD_ASSERT (abfd != NULL && ptr != NULL);
1253
1254   /* Print normal ELF private data.  */
1255   _bfd_elf_print_private_bfd_data (abfd, ptr);
1256
1257   flags = elf_elfheader (abfd)->e_flags;
1258   fprintf (file, _("private flags = 0x%lx:"), (long) flags);
1259
1260   if (flags & E_FLAG_RL78_CPU_MASK)
1261     fprintf (file, " [%s]", rl78_cpu_name (flags));
1262
1263   if (flags & E_FLAG_RL78_64BIT_DOUBLES)
1264     fprintf (file, _(" [64-bit doubles]"));
1265
1266   fputc ('\n', file);
1267   return TRUE;
1268 }
1269
1270 /* Return the MACH for an e_flags value.  */
1271
1272 static int
1273 elf32_rl78_machine (bfd * abfd ATTRIBUTE_UNUSED)
1274 {
1275   return bfd_mach_rl78;
1276 }
1277
1278 static bfd_boolean
1279 rl78_elf_object_p (bfd * abfd)
1280 {
1281   bfd_default_set_arch_mach (abfd, bfd_arch_rl78,
1282                              elf32_rl78_machine (abfd));
1283   return TRUE;
1284 }
1285 \f
1286 /* support PLT for 16-bit references to 24-bit functions.  */
1287
1288 /* We support 16-bit pointers to code above 64k by generating a thunk
1289    below 64k containing a JMP instruction to the final address.  */
1290
1291 static bfd_boolean
1292 rl78_elf_check_relocs
1293     (bfd *                     abfd,
1294      struct bfd_link_info *    info,
1295      asection *                sec,
1296      const Elf_Internal_Rela * relocs)
1297 {
1298   Elf_Internal_Shdr *           symtab_hdr;
1299   struct elf_link_hash_entry ** sym_hashes;
1300   const Elf_Internal_Rela *     rel;
1301   const Elf_Internal_Rela *     rel_end;
1302   bfd_vma *local_plt_offsets;
1303   asection *splt;
1304   bfd *dynobj;
1305
1306   if (bfd_link_relocatable (info))
1307     return TRUE;
1308
1309   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1310   sym_hashes = elf_sym_hashes (abfd);
1311   local_plt_offsets = elf_local_got_offsets (abfd);
1312   dynobj = elf_hash_table(info)->dynobj;
1313
1314   rel_end = relocs + sec->reloc_count;
1315   for (rel = relocs; rel < rel_end; rel++)
1316     {
1317       struct elf_link_hash_entry *h;
1318       unsigned long r_symndx;
1319       bfd_vma *offset;
1320
1321       r_symndx = ELF32_R_SYM (rel->r_info);
1322       if (r_symndx < symtab_hdr->sh_info)
1323         h = NULL;
1324       else
1325         {
1326           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1327           while (h->root.type == bfd_link_hash_indirect
1328                  || h->root.type == bfd_link_hash_warning)
1329             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1330         }
1331
1332       switch (ELF32_R_TYPE (rel->r_info))
1333         {
1334           /* This relocation describes a 16-bit pointer to a function.
1335              We may need to allocate a thunk in low memory; reserve memory
1336              for it now.  */
1337         case R_RL78_DIR16S:
1338           if (dynobj == NULL)
1339             elf_hash_table (info)->dynobj = dynobj = abfd;
1340           splt = elf_hash_table (info)->splt;
1341           if (splt == NULL)
1342             {
1343               flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1344                                 | SEC_IN_MEMORY | SEC_LINKER_CREATED
1345                                 | SEC_READONLY | SEC_CODE);
1346               splt = bfd_make_section_anyway_with_flags (dynobj, ".plt",
1347                                                          flags);
1348               elf_hash_table (info)->splt = splt;
1349               if (splt == NULL
1350                   || ! bfd_set_section_alignment (dynobj, splt, 1))
1351                 return FALSE;
1352             }
1353
1354           if (h != NULL)
1355             offset = &h->plt.offset;
1356           else
1357             {
1358               if (local_plt_offsets == NULL)
1359                 {
1360                   size_t size;
1361                   unsigned int i;
1362
1363                   size = symtab_hdr->sh_info * sizeof (bfd_vma);
1364                   local_plt_offsets = (bfd_vma *) bfd_alloc (abfd, size);
1365                   if (local_plt_offsets == NULL)
1366                     return FALSE;
1367                   elf_local_got_offsets (abfd) = local_plt_offsets;
1368
1369                   for (i = 0; i < symtab_hdr->sh_info; i++)
1370                     local_plt_offsets[i] = (bfd_vma) -1;
1371                 }
1372               offset = &local_plt_offsets[r_symndx];
1373             }
1374
1375           if (*offset == (bfd_vma) -1)
1376             {
1377               *offset = splt->size;
1378               splt->size += 4;
1379             }
1380           break;
1381         }
1382     }
1383
1384   return TRUE;
1385 }
1386
1387 /* This must exist if dynobj is ever set.  */
1388
1389 static bfd_boolean
1390 rl78_elf_finish_dynamic_sections (bfd *abfd ATTRIBUTE_UNUSED,
1391                                   struct bfd_link_info *info)
1392 {
1393   bfd *dynobj;
1394   asection *splt;
1395
1396   if (!elf_hash_table (info)->dynamic_sections_created)
1397     return TRUE;
1398
1399   /* As an extra sanity check, verify that all plt entries have been
1400      filled in.  However, relaxing might have changed the relocs so
1401      that some plt entries don't get filled in, so we have to skip
1402      this check if we're relaxing.  Unfortunately, check_relocs is
1403      called before relaxation.  */
1404
1405   if (info->relax_trip > 0)
1406     return TRUE;
1407
1408   dynobj = elf_hash_table (info)->dynobj;
1409   splt = elf_hash_table (info)->splt;
1410   if (dynobj != NULL && splt != NULL)
1411     {
1412       bfd_byte *contents = splt->contents;
1413       unsigned int i, size = splt->size;
1414
1415       for (i = 0; i < size; i += 4)
1416         {
1417           unsigned int x = bfd_get_32 (dynobj, contents + i);
1418           BFD_ASSERT (x != 0);
1419         }
1420     }
1421
1422   return TRUE;
1423 }
1424
1425 static bfd_boolean
1426 rl78_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1427                                struct bfd_link_info *info)
1428 {
1429   bfd *dynobj;
1430   asection *splt;
1431
1432   if (bfd_link_relocatable (info))
1433     return TRUE;
1434
1435   dynobj = elf_hash_table (info)->dynobj;
1436   if (dynobj == NULL)
1437     return TRUE;
1438
1439   splt = elf_hash_table (info)->splt;
1440   BFD_ASSERT (splt != NULL);
1441
1442   splt->contents = (bfd_byte *) bfd_zalloc (dynobj, splt->size);
1443   if (splt->contents == NULL)
1444     return FALSE;
1445
1446   return TRUE;
1447 }
1448
1449 \f
1450
1451 /* Handle relaxing.  */
1452
1453 /* A subroutine of rl78_elf_relax_section.  If the global symbol H
1454    is within the low 64k, remove any entry for it in the plt.  */
1455
1456 struct relax_plt_data
1457 {
1458   asection *splt;
1459   bfd_boolean *again;
1460 };
1461
1462 static bfd_boolean
1463 rl78_relax_plt_check (struct elf_link_hash_entry *h, void * xdata)
1464 {
1465   struct relax_plt_data *data = (struct relax_plt_data *) xdata;
1466
1467   if (h->plt.offset != (bfd_vma) -1)
1468     {
1469       bfd_vma address;
1470
1471       if (h->root.type == bfd_link_hash_undefined
1472           || h->root.type == bfd_link_hash_undefweak)
1473         address = 0;
1474       else
1475         address = (h->root.u.def.section->output_section->vma
1476                    + h->root.u.def.section->output_offset
1477                    + h->root.u.def.value);
1478
1479       if (valid_16bit_address (address))
1480         {
1481           h->plt.offset = -1;
1482           data->splt->size -= 4;
1483           *data->again = TRUE;
1484         }
1485     }
1486
1487   return TRUE;
1488 }
1489
1490 /* A subroutine of rl78_elf_relax_section.  If the global symbol H
1491    previously had a plt entry, give it a new entry offset.  */
1492
1493 static bfd_boolean
1494 rl78_relax_plt_realloc (struct elf_link_hash_entry *h, void * xdata)
1495 {
1496   bfd_vma *entry = (bfd_vma *) xdata;
1497
1498   if (h->plt.offset != (bfd_vma) -1)
1499     {
1500       h->plt.offset = *entry;
1501       *entry += 4;
1502     }
1503
1504   return TRUE;
1505 }
1506
1507 static bfd_boolean
1508 rl78_elf_relax_plt_section (bfd *dynobj,
1509                             asection *splt,
1510                             struct bfd_link_info *info,
1511                             bfd_boolean *again)
1512 {
1513   struct relax_plt_data relax_plt_data;
1514   bfd *ibfd;
1515
1516   /* Assume nothing changes.  */
1517   *again = FALSE;
1518
1519   if (bfd_link_relocatable (info))
1520     return TRUE;
1521
1522   /* We only relax the .plt section at the moment.  */
1523   if (dynobj != elf_hash_table (info)->dynobj
1524       || strcmp (splt->name, ".plt") != 0)
1525     return TRUE;
1526
1527   /* Quick check for an empty plt.  */
1528   if (splt->size == 0)
1529     return TRUE;
1530
1531   /* Map across all global symbols; see which ones happen to
1532      fall in the low 64k.  */
1533   relax_plt_data.splt = splt;
1534   relax_plt_data.again = again;
1535   elf_link_hash_traverse (elf_hash_table (info), rl78_relax_plt_check,
1536                           &relax_plt_data);
1537
1538   /* Likewise for local symbols, though that's somewhat less convenient
1539      as we have to walk the list of input bfds and swap in symbol data.  */
1540   for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1541     {
1542       bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1543       Elf_Internal_Shdr *symtab_hdr;
1544       Elf_Internal_Sym *isymbuf = NULL;
1545       unsigned int idx;
1546
1547       if (! local_plt_offsets)
1548         continue;
1549
1550       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1551       if (symtab_hdr->sh_info != 0)
1552         {
1553           isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1554           if (isymbuf == NULL)
1555             isymbuf = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
1556                                             symtab_hdr->sh_info, 0,
1557                                             NULL, NULL, NULL);
1558           if (isymbuf == NULL)
1559             return FALSE;
1560         }
1561
1562       for (idx = 0; idx < symtab_hdr->sh_info; ++idx)
1563         {
1564           Elf_Internal_Sym *isym;
1565           asection *tsec;
1566           bfd_vma address;
1567
1568           if (local_plt_offsets[idx] == (bfd_vma) -1)
1569             continue;
1570
1571           isym = &isymbuf[idx];
1572           if (isym->st_shndx == SHN_UNDEF)
1573             continue;
1574           else if (isym->st_shndx == SHN_ABS)
1575             tsec = bfd_abs_section_ptr;
1576           else if (isym->st_shndx == SHN_COMMON)
1577             tsec = bfd_com_section_ptr;
1578           else
1579             tsec = bfd_section_from_elf_index (ibfd, isym->st_shndx);
1580
1581           address = (tsec->output_section->vma
1582                      + tsec->output_offset
1583                      + isym->st_value);
1584           if (valid_16bit_address (address))
1585             {
1586               local_plt_offsets[idx] = -1;
1587               splt->size -= 4;
1588               *again = TRUE;
1589             }
1590         }
1591
1592       if (isymbuf != NULL
1593           && symtab_hdr->contents != (unsigned char *) isymbuf)
1594         {
1595           if (! info->keep_memory)
1596             free (isymbuf);
1597           else
1598             {
1599               /* Cache the symbols for elf_link_input_bfd.  */
1600               symtab_hdr->contents = (unsigned char *) isymbuf;
1601             }
1602         }
1603     }
1604
1605   /* If we changed anything, walk the symbols again to reallocate
1606      .plt entry addresses.  */
1607   if (*again && splt->size > 0)
1608     {
1609       bfd_vma entry = 0;
1610
1611       elf_link_hash_traverse (elf_hash_table (info),
1612                               rl78_relax_plt_realloc, &entry);
1613
1614       for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1615         {
1616           bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1617           unsigned int nlocals = elf_tdata (ibfd)->symtab_hdr.sh_info;
1618           unsigned int idx;
1619
1620           if (! local_plt_offsets)
1621             continue;
1622
1623           for (idx = 0; idx < nlocals; ++idx)
1624             if (local_plt_offsets[idx] != (bfd_vma) -1)
1625               {
1626                 local_plt_offsets[idx] = entry;
1627                 entry += 4;
1628               }
1629         }
1630     }
1631
1632   return TRUE;
1633 }
1634
1635 /* Delete some bytes from a section while relaxing.  */
1636
1637 static bfd_boolean
1638 elf32_rl78_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count,
1639                                Elf_Internal_Rela *alignment_rel, int force_snip)
1640 {
1641   Elf_Internal_Shdr * symtab_hdr;
1642   unsigned int        sec_shndx;
1643   bfd_byte *          contents;
1644   Elf_Internal_Rela * irel;
1645   Elf_Internal_Rela * irelend;
1646   Elf_Internal_Sym *  isym;
1647   Elf_Internal_Sym *  isymend;
1648   bfd_vma             toaddr;
1649   unsigned int        symcount;
1650   struct elf_link_hash_entry ** sym_hashes;
1651   struct elf_link_hash_entry ** end_hashes;
1652
1653   if (!alignment_rel)
1654     force_snip = 1;
1655
1656   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1657
1658   contents = elf_section_data (sec)->this_hdr.contents;
1659
1660   /* The deletion must stop at the next alignment boundary, if
1661      ALIGNMENT_REL is non-NULL.  */
1662   toaddr = sec->size;
1663   if (alignment_rel)
1664     toaddr = alignment_rel->r_offset;
1665
1666   irel = elf_section_data (sec)->relocs;
1667   if (irel == NULL)
1668     {
1669       _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL, TRUE);
1670       irel = elf_section_data (sec)->relocs;
1671     }
1672
1673   irelend = irel + sec->reloc_count;
1674
1675   /* Actually delete the bytes.  */
1676   memmove (contents + addr, contents + addr + count,
1677            (size_t) (toaddr - addr - count));
1678
1679   /* If we don't have an alignment marker to worry about, we can just
1680      shrink the section.  Otherwise, we have to fill in the newly
1681      created gap with NOP insns (0x03).  */
1682   if (force_snip)
1683     sec->size -= count;
1684   else
1685     memset (contents + toaddr - count, 0x03, count);
1686
1687   /* Adjust all the relocs.  */
1688   for (; irel && irel < irelend; irel++)
1689     {
1690       /* Get the new reloc address.  */
1691       if (irel->r_offset > addr
1692           && (irel->r_offset < toaddr
1693               || (force_snip && irel->r_offset == toaddr)))
1694         irel->r_offset -= count;
1695
1696       /* If we see an ALIGN marker at the end of the gap, we move it
1697          to the beginning of the gap, since marking these gaps is what
1698          they're for.  */
1699       if (irel->r_offset == toaddr
1700           && ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
1701           && irel->r_addend & RL78_RELAXA_ALIGN)
1702         irel->r_offset -= count;
1703     }
1704
1705   /* Adjust the local symbols defined in this section.  */
1706   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1707   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1708   isymend = isym + symtab_hdr->sh_info;
1709
1710   for (; isym < isymend; isym++)
1711     {
1712       /* If the symbol is in the range of memory we just moved, we
1713          have to adjust its value.  */
1714       if (isym->st_shndx == sec_shndx
1715           && isym->st_value > addr
1716           && isym->st_value < toaddr)
1717         isym->st_value -= count;
1718
1719       /* If the symbol *spans* the bytes we just deleted (i.e. it's
1720          *end* is in the moved bytes but it's *start* isn't), then we
1721          must adjust its size.  */
1722       if (isym->st_shndx == sec_shndx
1723           && isym->st_value < addr
1724           && isym->st_value + isym->st_size > addr
1725           && isym->st_value + isym->st_size < toaddr)
1726         isym->st_size -= count;
1727     }
1728
1729   /* Now adjust the global symbols defined in this section.  */
1730   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1731               - symtab_hdr->sh_info);
1732   sym_hashes = elf_sym_hashes (abfd);
1733   end_hashes = sym_hashes + symcount;
1734
1735   for (; sym_hashes < end_hashes; sym_hashes++)
1736     {
1737       struct elf_link_hash_entry *sym_hash = *sym_hashes;
1738
1739       if ((sym_hash->root.type == bfd_link_hash_defined
1740            || sym_hash->root.type == bfd_link_hash_defweak)
1741           && sym_hash->root.u.def.section == sec)
1742         {
1743           /* As above, adjust the value if needed.  */
1744           if (sym_hash->root.u.def.value > addr
1745               && sym_hash->root.u.def.value < toaddr)
1746             sym_hash->root.u.def.value -= count;
1747
1748           /* As above, adjust the size if needed.  */
1749           if (sym_hash->root.u.def.value < addr
1750               && sym_hash->root.u.def.value + sym_hash->size > addr
1751               && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1752             sym_hash->size -= count;
1753         }
1754     }
1755
1756   return TRUE;
1757 }
1758
1759 /* Used to sort relocs by address.  If relocs have the same address,
1760    we maintain their relative order, except that R_RL78_RH_RELAX
1761    alignment relocs must be the first reloc for any given address.  */
1762
1763 static void
1764 reloc_bubblesort (Elf_Internal_Rela * r, int count)
1765 {
1766   int i;
1767   bfd_boolean again;
1768   bfd_boolean swappit;
1769
1770   /* This is almost a classic bubblesort.  It's the slowest sort, but
1771      we're taking advantage of the fact that the relocations are
1772      mostly in order already (the assembler emits them that way) and
1773      we need relocs with the same address to remain in the same
1774      relative order.  */
1775   again = TRUE;
1776   while (again)
1777     {
1778       again = FALSE;
1779       for (i = 0; i < count - 1; i ++)
1780         {
1781           if (r[i].r_offset > r[i + 1].r_offset)
1782             swappit = TRUE;
1783           else if (r[i].r_offset < r[i + 1].r_offset)
1784             swappit = FALSE;
1785           else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
1786                    && (r[i + 1].r_addend & RL78_RELAXA_ALIGN))
1787             swappit = TRUE;
1788           else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
1789                    && (r[i + 1].r_addend & RL78_RELAXA_ELIGN)
1790                    && !(ELF32_R_TYPE (r[i].r_info) == R_RL78_RH_RELAX
1791                         && (r[i].r_addend & RL78_RELAXA_ALIGN)))
1792             swappit = TRUE;
1793           else
1794             swappit = FALSE;
1795
1796           if (swappit)
1797             {
1798               Elf_Internal_Rela tmp;
1799
1800               tmp = r[i];
1801               r[i] = r[i + 1];
1802               r[i + 1] = tmp;
1803               /* If we do move a reloc back, re-scan to see if it
1804                  needs to be moved even further back.  This avoids
1805                  most of the O(n^2) behavior for our cases.  */
1806               if (i > 0)
1807                 i -= 2;
1808               again = TRUE;
1809             }
1810         }
1811     }
1812 }
1813
1814
1815 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
1816   rl78_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1817                          lrel, abfd, sec, link_info, scale)
1818
1819 static bfd_vma
1820 rl78_offset_for_reloc (bfd *                    abfd,
1821                        Elf_Internal_Rela *      rel,
1822                        Elf_Internal_Shdr *      symtab_hdr,
1823                        Elf_External_Sym_Shndx * shndx_buf ATTRIBUTE_UNUSED,
1824                        Elf_Internal_Sym *       intsyms,
1825                        Elf_Internal_Rela **     lrel,
1826                        bfd *                    input_bfd,
1827                        asection *               input_section,
1828                        struct bfd_link_info *   info,
1829                        int *                    scale)
1830 {
1831   bfd_vma symval;
1832
1833   *scale = 1;
1834
1835   /* REL is the first of 1..N relocations.  We compute the symbol
1836      value for each relocation, then combine them if needed.  LREL
1837      gets a pointer to the last relocation used.  */
1838   while (1)
1839     {
1840       unsigned long r_type;
1841
1842       /* Get the value of the symbol referred to by the reloc.  */
1843       if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1844         {
1845           /* A local symbol.  */
1846           Elf_Internal_Sym *isym;
1847           asection *ssec;
1848
1849           isym = intsyms + ELF32_R_SYM (rel->r_info);
1850
1851           if (isym->st_shndx == SHN_UNDEF)
1852             ssec = bfd_und_section_ptr;
1853           else if (isym->st_shndx == SHN_ABS)
1854             ssec = bfd_abs_section_ptr;
1855           else if (isym->st_shndx == SHN_COMMON)
1856             ssec = bfd_com_section_ptr;
1857           else
1858             ssec = bfd_section_from_elf_index (abfd,
1859                                                isym->st_shndx);
1860
1861           /* Initial symbol value.  */
1862           symval = isym->st_value;
1863
1864           /* GAS may have made this symbol relative to a section, in
1865              which case, we have to add the addend to find the
1866              symbol.  */
1867           if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
1868             symval += rel->r_addend;
1869
1870           if (ssec)
1871             {
1872               if ((ssec->flags & SEC_MERGE)
1873                   && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
1874                 symval = _bfd_merged_section_offset (abfd, & ssec,
1875                                                      elf_section_data (ssec)->sec_info,
1876                                                      symval);
1877             }
1878
1879           /* Now make the offset relative to where the linker is putting it.  */
1880           if (ssec)
1881             symval +=
1882               ssec->output_section->vma + ssec->output_offset;
1883
1884           symval += rel->r_addend;
1885         }
1886       else
1887         {
1888           unsigned long indx;
1889           struct elf_link_hash_entry * h;
1890
1891           /* An external symbol.  */
1892           indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1893           h = elf_sym_hashes (abfd)[indx];
1894           BFD_ASSERT (h != NULL);
1895
1896           if (h->root.type != bfd_link_hash_defined
1897               && h->root.type != bfd_link_hash_defweak)
1898             {
1899               /* This appears to be a reference to an undefined
1900                  symbol.  Just ignore it--it will be caught by the
1901                  regular reloc processing.  */
1902               if (lrel)
1903                 *lrel = rel;
1904               return 0;
1905             }
1906
1907           symval = (h->root.u.def.value
1908                     + h->root.u.def.section->output_section->vma
1909                     + h->root.u.def.section->output_offset);
1910
1911           symval += rel->r_addend;
1912         }
1913
1914       r_type = ELF32_R_TYPE (rel->r_info);
1915       switch (r_type)
1916         {
1917         case R_RL78_SYM:
1918           (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1919           break;
1920
1921         case R_RL78_OPromtop:
1922           symval = get_romstart (info, input_bfd, input_section, rel->r_offset);
1923           (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1924           break;
1925
1926         case R_RL78_OPramtop:
1927           symval = get_ramstart (info, input_bfd, input_section, rel->r_offset);
1928           (void) rl78_compute_complex_reloc (r_type, symval, input_section);
1929           break;
1930
1931         case R_RL78_OPneg:
1932         case R_RL78_OPadd:
1933         case R_RL78_OPsub:
1934         case R_RL78_OPmul:
1935         case R_RL78_OPdiv:
1936         case R_RL78_OPshla:
1937         case R_RL78_OPshra:
1938         case R_RL78_OPsctsize:
1939         case R_RL78_OPscttop:
1940         case R_RL78_OPand:
1941         case R_RL78_OPor:
1942         case R_RL78_OPxor:
1943         case R_RL78_OPnot:
1944         case R_RL78_OPmod:
1945           (void) rl78_compute_complex_reloc (r_type, 0, input_section);
1946           break;
1947
1948         case R_RL78_DIR16UL:
1949         case R_RL78_DIR8UL:
1950         case R_RL78_ABS16UL:
1951         case R_RL78_ABS8UL:
1952           *scale = 4;
1953           goto reloc_computes_value;
1954
1955         case R_RL78_DIR16UW:
1956         case R_RL78_DIR8UW:
1957         case R_RL78_ABS16UW:
1958         case R_RL78_ABS8UW:
1959           *scale = 2;
1960           goto reloc_computes_value;
1961
1962         default:
1963         reloc_computes_value:
1964           symval = rl78_compute_complex_reloc (r_type, symval, input_section);
1965           /* Fall through.  */
1966         case R_RL78_DIR32:
1967         case R_RL78_DIR24S:
1968         case R_RL78_DIR16:
1969         case R_RL78_DIR16U:
1970         case R_RL78_DIR16S:
1971         case R_RL78_DIR24S_PCREL:
1972         case R_RL78_DIR16S_PCREL:
1973         case R_RL78_DIR8S_PCREL:
1974           if (lrel)
1975             *lrel = rel;
1976           return symval;
1977         }
1978
1979       rel ++;
1980     }
1981 }
1982
1983 struct {
1984   int prefix;           /* or -1 for "no prefix" */
1985   int insn;             /* or -1 for "end of list" */
1986   int insn_for_saddr;   /* or -1 for "no alternative" */
1987   int insn_for_sfr;     /* or -1 for "no alternative" */
1988 } relax_addr16[] = {
1989   { -1, 0x02, 0x06, -1 },       /* ADDW AX, !addr16 */
1990   { -1, 0x22, 0x26, -1 },       /* SUBW AX, !addr16 */
1991   { -1, 0x42, 0x46, -1 },       /* CMPW AX, !addr16 */
1992   { -1, 0x40, 0x4a, -1 },       /* CMP  !addr16, #byte */
1993
1994   { -1, 0x0f, 0x0b, -1 },       /* ADD  A, !addr16 */
1995   { -1, 0x1f, 0x1b, -1 },       /* ADDC A, !addr16 */
1996   { -1, 0x2f, 0x2b, -1 },       /* SUB  A, !addr16 */
1997   { -1, 0x3f, 0x3b, -1 },       /* SUBC A, !addr16 */
1998   { -1, 0x4f, 0x4b, -1 },       /* CMP  A, !addr16 */
1999   { -1, 0x5f, 0x5b, -1 },       /* AND  A, !addr16 */
2000   { -1, 0x6f, 0x6b, -1 },       /* OR   A, !addr16 */
2001   { -1, 0x7f, 0x7b, -1 },       /* XOR  A, !addr16 */
2002
2003   { -1, 0x8f, 0x8d, 0x8e },     /* MOV  A, !addr16 */
2004   { -1, 0x9f, 0x9d, 0x9e },     /* MOV  !addr16, A */
2005   { -1, 0xaf, 0xad, 0xae },     /* MOVW AX, !addr16 */
2006   { -1, 0xbf, 0xbd, 0xbe },     /* MOVW !addr16, AX */
2007   { -1, 0xcf, 0xcd, 0xce },     /* MOVW !addr16, #word */
2008
2009   { -1, 0xa0, 0xa4, -1 },       /* INC  !addr16 */
2010   { -1, 0xa2, 0xa6, -1 },       /* INCW !addr16 */
2011   { -1, 0xb0, 0xb4, -1 },       /* DEC  !addr16 */
2012   { -1, 0xb2, 0xb6, -1 },       /* DECW !addr16 */
2013
2014   { -1, 0xd5, 0xd4, -1 },       /* CMP0 !addr16 */
2015   { -1, 0xe5, 0xe4, -1 },       /* ONEB !addr16 */
2016   { -1, 0xf5, 0xf4, -1 },       /* CLRB !addr16 */
2017
2018   { -1, 0xd9, 0xd8, -1 },       /* MOV  X, !addr16 */
2019   { -1, 0xe9, 0xe8, -1 },       /* MOV  B, !addr16 */
2020   { -1, 0xf9, 0xf8, -1 },       /* MOV  C, !addr16 */
2021   { -1, 0xdb, 0xda, -1 },       /* MOVW BC, !addr16 */
2022   { -1, 0xeb, 0xea, -1 },       /* MOVW DE, !addr16 */
2023   { -1, 0xfb, 0xfa, -1 },       /* MOVW HL, !addr16 */
2024
2025   { 0x61, 0xaa, 0xa8, -1 },     /* XCH  A, !addr16 */
2026
2027   { 0x71, 0x00, 0x02, 0x0a },   /* SET1 !addr16.0 */
2028   { 0x71, 0x10, 0x12, 0x1a },   /* SET1 !addr16.0 */
2029   { 0x71, 0x20, 0x22, 0x2a },   /* SET1 !addr16.0 */
2030   { 0x71, 0x30, 0x32, 0x3a },   /* SET1 !addr16.0 */
2031   { 0x71, 0x40, 0x42, 0x4a },   /* SET1 !addr16.0 */
2032   { 0x71, 0x50, 0x52, 0x5a },   /* SET1 !addr16.0 */
2033   { 0x71, 0x60, 0x62, 0x6a },   /* SET1 !addr16.0 */
2034   { 0x71, 0x70, 0x72, 0x7a },   /* SET1 !addr16.0 */
2035
2036   { 0x71, 0x08, 0x03, 0x0b },   /* CLR1 !addr16.0 */
2037   { 0x71, 0x18, 0x13, 0x1b },   /* CLR1 !addr16.0 */
2038   { 0x71, 0x28, 0x23, 0x2b },   /* CLR1 !addr16.0 */
2039   { 0x71, 0x38, 0x33, 0x3b },   /* CLR1 !addr16.0 */
2040   { 0x71, 0x48, 0x43, 0x4b },   /* CLR1 !addr16.0 */
2041   { 0x71, 0x58, 0x53, 0x5b },   /* CLR1 !addr16.0 */
2042   { 0x71, 0x68, 0x63, 0x6b },   /* CLR1 !addr16.0 */
2043   { 0x71, 0x78, 0x73, 0x7b },   /* CLR1 !addr16.0 */
2044
2045   { -1, -1, -1, -1 }
2046 };
2047
2048 /* Relax one section.  */
2049
2050 static bfd_boolean
2051 rl78_elf_relax_section
2052     (bfd *                  abfd,
2053      asection *             sec,
2054      struct bfd_link_info * link_info,
2055      bfd_boolean *          again)
2056 {
2057   Elf_Internal_Shdr * symtab_hdr;
2058   Elf_Internal_Shdr * shndx_hdr;
2059   Elf_Internal_Rela * internal_relocs;
2060   Elf_Internal_Rela * free_relocs = NULL;
2061   Elf_Internal_Rela * irel;
2062   Elf_Internal_Rela * srel;
2063   Elf_Internal_Rela * irelend;
2064   Elf_Internal_Rela * next_alignment;
2065   bfd_byte *          contents = NULL;
2066   bfd_byte *          free_contents = NULL;
2067   Elf_Internal_Sym *  intsyms = NULL;
2068   Elf_Internal_Sym *  free_intsyms = NULL;
2069   Elf_External_Sym_Shndx * shndx_buf = NULL;
2070   bfd_vma pc;
2071   bfd_vma symval ATTRIBUTE_UNUSED = 0;
2072   int pcrel ATTRIBUTE_UNUSED = 0;
2073   int code ATTRIBUTE_UNUSED = 0;
2074   int section_alignment_glue;
2075   int scale;
2076
2077   if (abfd == elf_hash_table (link_info)->dynobj
2078       && strcmp (sec->name, ".plt") == 0)
2079     return rl78_elf_relax_plt_section (abfd, sec, link_info, again);
2080
2081   /* Assume nothing changes.  */
2082   *again = FALSE;
2083
2084   /* We don't have to do anything for a relocatable link, if
2085      this section does not have relocs, or if this is not a
2086      code section.  */
2087   if (bfd_link_relocatable (link_info)
2088       || (sec->flags & SEC_RELOC) == 0
2089       || sec->reloc_count == 0
2090       || (sec->flags & SEC_CODE) == 0)
2091     return TRUE;
2092
2093   symtab_hdr = & elf_symtab_hdr (abfd);
2094   if (elf_symtab_shndx_list (abfd))
2095     shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
2096   else
2097     shndx_hdr = NULL;
2098
2099   /* Get the section contents.  */
2100   if (elf_section_data (sec)->this_hdr.contents != NULL)
2101     contents = elf_section_data (sec)->this_hdr.contents;
2102   /* Go get them off disk.  */
2103   else
2104     {
2105       if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2106         goto error_return;
2107       elf_section_data (sec)->this_hdr.contents = contents;
2108     }
2109
2110   /* Read this BFD's symbols.  */
2111   /* Get cached copy if it exists.  */
2112   if (symtab_hdr->contents != NULL)
2113     intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
2114   else
2115     {
2116       intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
2117       symtab_hdr->contents = (bfd_byte *) intsyms;
2118     }
2119
2120   if (shndx_hdr && shndx_hdr->sh_size != 0)
2121     {
2122       bfd_size_type amt;
2123
2124       amt = symtab_hdr->sh_info;
2125       amt *= sizeof (Elf_External_Sym_Shndx);
2126       shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
2127       if (shndx_buf == NULL)
2128         goto error_return;
2129       if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
2130           || bfd_bread (shndx_buf, amt, abfd) != amt)
2131         goto error_return;
2132       shndx_hdr->contents = (bfd_byte *) shndx_buf;
2133     }
2134
2135   /* Get a copy of the native relocations.  */
2136   internal_relocs = (_bfd_elf_link_read_relocs
2137                      (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2138                       link_info->keep_memory));
2139   if (internal_relocs == NULL)
2140     goto error_return;
2141   if (! link_info->keep_memory)
2142     free_relocs = internal_relocs;
2143
2144   /* The RL_ relocs must be just before the operand relocs they go
2145      with, so we must sort them to guarantee this.  We use bubblesort
2146      instead of qsort so we can guarantee that relocs with the same
2147      address remain in the same relative order.  */
2148   reloc_bubblesort (internal_relocs, sec->reloc_count);
2149
2150   /* Walk through them looking for relaxing opportunities.  */
2151   irelend = internal_relocs + sec->reloc_count;
2152
2153
2154   /* This will either be NULL or a pointer to the next alignment
2155      relocation.  */
2156   next_alignment = internal_relocs;
2157
2158   /* We calculate worst case shrinkage caused by alignment directives.
2159      No fool-proof, but better than either ignoring the problem or
2160      doing heavy duty analysis of all the alignment markers in all
2161      input sections.  */
2162   section_alignment_glue = 0;
2163   for (irel = internal_relocs; irel < irelend; irel++)
2164       if (ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
2165           && irel->r_addend & RL78_RELAXA_ALIGN)
2166         {
2167           int this_glue = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
2168
2169           if (section_alignment_glue < this_glue)
2170             section_alignment_glue = this_glue;
2171         }
2172   /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
2173      shrinkage.  */
2174   section_alignment_glue *= 2;
2175
2176   for (irel = internal_relocs; irel < irelend; irel++)
2177     {
2178       unsigned char *insn;
2179       int nrelocs;
2180
2181       /* The insns we care about are all marked with one of these.  */
2182       if (ELF32_R_TYPE (irel->r_info) != R_RL78_RH_RELAX)
2183         continue;
2184
2185       if (irel->r_addend & RL78_RELAXA_ALIGN
2186           || next_alignment == internal_relocs)
2187         {
2188           /* When we delete bytes, we need to maintain all the alignments
2189              indicated.  In addition, we need to be careful about relaxing
2190              jumps across alignment boundaries - these displacements
2191              *grow* when we delete bytes.  For now, don't shrink
2192              displacements across an alignment boundary, just in case.
2193              Note that this only affects relocations to the same
2194              section.  */
2195           next_alignment += 2;
2196           while (next_alignment < irelend
2197                  && (ELF32_R_TYPE (next_alignment->r_info) != R_RL78_RH_RELAX
2198                      || !(next_alignment->r_addend & RL78_RELAXA_ELIGN)))
2199             next_alignment ++;
2200           if (next_alignment >= irelend || next_alignment->r_offset == 0)
2201             next_alignment = NULL;
2202         }
2203
2204       /* When we hit alignment markers, see if we've shrunk enough
2205          before them to reduce the gap without violating the alignment
2206          requirements.  */
2207       if (irel->r_addend & RL78_RELAXA_ALIGN)
2208         {
2209           /* At this point, the next relocation *should* be the ELIGN
2210              end marker.  */
2211           Elf_Internal_Rela *erel = irel + 1;
2212           unsigned int alignment, nbytes;
2213
2214           if (ELF32_R_TYPE (erel->r_info) != R_RL78_RH_RELAX)
2215             continue;
2216           if (!(erel->r_addend & RL78_RELAXA_ELIGN))
2217             continue;
2218
2219           alignment = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
2220
2221           if (erel->r_offset - irel->r_offset < alignment)
2222             continue;
2223
2224           nbytes = erel->r_offset - irel->r_offset;
2225           nbytes /= alignment;
2226           nbytes *= alignment;
2227
2228           elf32_rl78_relax_delete_bytes (abfd, sec, erel->r_offset - nbytes, nbytes,
2229                                          next_alignment, erel->r_offset == sec->size);
2230           *again = TRUE;
2231
2232           continue;
2233         }
2234
2235       if (irel->r_addend & RL78_RELAXA_ELIGN)
2236           continue;
2237
2238       insn = contents + irel->r_offset;
2239
2240       nrelocs = irel->r_addend & RL78_RELAXA_RNUM;
2241
2242       /* At this point, we have an insn that is a candidate for linker
2243          relaxation.  There are NRELOCS relocs following that may be
2244          relaxed, although each reloc may be made of more than one
2245          reloc entry (such as gp-rel symbols).  */
2246
2247       /* Get the value of the symbol referred to by the reloc.  Just
2248          in case this is the last reloc in the list, use the RL's
2249          addend to choose between this reloc (no addend) or the next
2250          (yes addend, which means at least one following reloc).  */
2251
2252       /* srel points to the "current" reloction for this insn -
2253          actually the last reloc for a given operand, which is the one
2254          we need to update.  We check the relaxations in the same
2255          order that the relocations happen, so we'll just push it
2256          along as we go.  */
2257       srel = irel;
2258
2259       pc = sec->output_section->vma + sec->output_offset
2260         + srel->r_offset;
2261
2262 #define GET_RELOC                                       \
2263       BFD_ASSERT (nrelocs > 0);                         \
2264       symval = OFFSET_FOR_RELOC (srel, &srel, &scale);  \
2265       pcrel = symval - pc + srel->r_addend;             \
2266       nrelocs --;
2267
2268 #define SNIPNR(offset, nbytes) \
2269         elf32_rl78_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0);
2270
2271 #define SNIP(offset, nbytes, newtype)                                   \
2272         SNIPNR (offset, nbytes);                                        \
2273         srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2274
2275       /* The order of these bit tests must match the order that the
2276          relocs appear in.  Since we sorted those by offset, we can
2277          predict them.  */
2278
2279       /*----------------------------------------------------------------------*/
2280       /* EF ad          BR $rel8        pcrel
2281          ED al ah       BR !abs16       abs
2282          EE al ah       BR $!rel16      pcrel
2283          EC al ah as    BR !!abs20      abs
2284
2285          FD al ah       CALL !abs16     abs
2286          FE al ah       CALL $!rel16    pcrel
2287          FC al ah as    CALL !!abs20    abs
2288
2289          DC ad          BC  $rel8
2290          DE ad          BNC $rel8
2291          DD ad          BZ  $rel8
2292          DF ad          BNZ $rel8
2293          61 C3 ad       BH  $rel8
2294          61 D3 ad       BNH $rel8
2295          61 C8 EF ad    SKC  ; BR $rel8
2296          61 D8 EF ad    SKNC ; BR $rel8
2297          61 E8 EF ad    SKZ  ; BR $rel8
2298          61 F8 EF ad    SKNZ ; BR $rel8
2299          61 E3 EF ad    SKH  ; BR $rel8
2300          61 F3 EF ad    SKNH ; BR $rel8
2301        */
2302
2303       if ((irel->r_addend & RL78_RELAXA_MASK) == RL78_RELAXA_BRA)
2304         {
2305           /* SKIP opcodes that skip non-branches will have a relax tag
2306              but no corresponding symbol to relax against; we just
2307              skip those.  */
2308           if (irel->r_addend & RL78_RELAXA_RNUM)
2309             {
2310               GET_RELOC;
2311             }
2312
2313           switch (insn[0])
2314             {
2315             case 0xdc: /* BC */
2316             case 0xdd: /* BZ */
2317             case 0xde: /* BNC */
2318             case 0xdf: /* BNZ */
2319               if (insn[1] == 0x03 && insn[2] == 0xee /* BR */
2320                   && (srel->r_offset - irel->r_offset) > 1) /* a B<c> without its own reloc */
2321                 {
2322                   /* This is a "long" conditional as generated by gas:
2323                      DC 03 EE ad.dr  */
2324                   if (pcrel < 127
2325                       && pcrel > -127)
2326                     {
2327                       insn[0] ^= 0x02; /* invert conditional */
2328                       SNIPNR (4, 1);
2329                       SNIP (1, 2, R_RL78_DIR8S_PCREL);
2330                       insn[1] = pcrel;
2331                       *again = TRUE;
2332                     }
2333                 }
2334               break;
2335
2336             case 0xec: /* BR !!abs20 */
2337
2338               if (pcrel < 127
2339                   && pcrel > -127)
2340                 {
2341                   insn[0] = 0xef;
2342                   insn[1] = pcrel;
2343                   SNIP (2, 2, R_RL78_DIR8S_PCREL);
2344                   *again = TRUE;
2345                 }
2346               else if (symval < 65536)
2347                 {
2348                   insn[0] = 0xed;
2349                   insn[1] = symval & 0xff;
2350                   insn[2] = symval >> 8;
2351                   SNIP (2, 1, R_RL78_DIR16U);
2352                   *again = TRUE;
2353                 }
2354               else if (pcrel < 32767
2355                        && pcrel > -32767)
2356                 {
2357                   insn[0] = 0xee;
2358                   insn[1] = pcrel & 0xff;
2359                   insn[2] = pcrel >> 8;
2360                   SNIP (2, 1, R_RL78_DIR16S_PCREL);
2361                   *again = TRUE;
2362                 }
2363               break;
2364
2365             case 0xee: /* BR $!pcrel16 */
2366             case 0xed: /* BR $!abs16 */
2367               if (pcrel < 127
2368                   && pcrel > -127)
2369                 {
2370                   insn[0] = 0xef;
2371                   insn[1] = pcrel;
2372                   SNIP (2, 1, R_RL78_DIR8S_PCREL);
2373                   *again = TRUE;
2374                 }
2375               break;
2376
2377             case 0xfc: /* CALL !!abs20 */
2378               if (symval < 65536)
2379                 {
2380                   insn[0] = 0xfd;
2381                   insn[1] = symval & 0xff;
2382                   insn[2] = symval >> 8;
2383                   SNIP (2, 1, R_RL78_DIR16U);
2384                   *again = TRUE;
2385                 }
2386               else if (pcrel < 32767
2387                        && pcrel > -32767)
2388                 {
2389                   insn[0] = 0xfe;
2390                   insn[1] = pcrel & 0xff;
2391                   insn[2] = pcrel >> 8;
2392                   SNIP (2, 1, R_RL78_DIR16S_PCREL);
2393                   *again = TRUE;
2394                 }
2395               break;
2396
2397             case 0x61: /* PREFIX */
2398               /* For SKIP/BR, we change the BR opcode and delete the
2399                  SKIP.  That way, we don't have to find and change the
2400                  relocation for the BR.  */
2401               /* Note that, for the case where we're skipping some
2402                  other insn, we have no "other" reloc but that's safe
2403                  here anyway. */
2404               switch (insn[1])
2405                 {
2406                 case 0xd3: /* BNH */
2407                 case 0xc3: /* BH */
2408                   if (insn[2] == 0x03 && insn[3] == 0xee
2409                       && (srel->r_offset - irel->r_offset) > 2) /* a B<c> without its own reloc */
2410                     {
2411                       /* Another long branch by gas:
2412                          61 D3 03 EE ad.dr  */
2413                       if (pcrel < 127
2414                           && pcrel > -127)
2415                         {
2416                           insn[1] ^= 0x10; /* invert conditional */
2417                           SNIPNR (5, 1);
2418                           SNIP (2, 2, R_RL78_DIR8S_PCREL);
2419                           insn[2] = pcrel;
2420                           *again = TRUE;
2421                         }
2422                     }
2423                   break;
2424
2425                 case 0xc8: /* SKC */
2426                   if (insn[2] == 0xef)
2427                     {
2428                       insn[2] = 0xde; /* BNC */
2429                       SNIPNR (0, 2);
2430                     }
2431                   break;
2432
2433                 case 0xd8: /* SKNC */
2434                   if (insn[2] == 0xef)
2435                     {
2436                       insn[2] = 0xdc; /* BC */
2437                       SNIPNR (0, 2);
2438                     }
2439                   break;
2440
2441                 case 0xe8: /* SKZ */
2442                   if (insn[2] == 0xef)
2443                     {
2444                       insn[2] = 0xdf; /* BNZ */
2445                       SNIPNR (0, 2);
2446                     }
2447                   break;
2448
2449                 case 0xf8: /* SKNZ */
2450                   if (insn[2] == 0xef)
2451                     {
2452                       insn[2] = 0xdd; /* BZ */
2453                       SNIPNR (0, 2);
2454                     }
2455                   break;
2456
2457                 case 0xe3: /* SKH */
2458                   if (insn[2] == 0xef)
2459                     {
2460                       insn[2] = 0xd3; /* BNH */
2461                       SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2462                     }
2463                   break;
2464
2465                 case 0xf3: /* SKNH */
2466                   if (insn[2] == 0xef)
2467                     {
2468                       insn[2] = 0xc3; /* BH */
2469                       SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2470                     }
2471                   break;
2472                 }
2473               break;
2474             }
2475         }
2476
2477       if ((irel->r_addend &  RL78_RELAXA_MASK) == RL78_RELAXA_ADDR16
2478           && nrelocs > 0)
2479         {
2480           /*----------------------------------------------------------------------*/
2481           /* Some insns have both a 16-bit address operand and an 8-bit
2482              variant if the address is within a special range:
2483
2484              Address            16-bit operand  SADDR range     SFR range
2485              FFF00-FFFFF        0xff00-0xffff   0x00-0xff
2486              FFE20-FFF1F        0xfe20-0xff1f                   0x00-0xff
2487
2488              The RELAX_ADDR16[] array has the insn encodings for the
2489              16-bit operand version, as well as the SFR and SADDR
2490              variants.  We only need to replace the encodings and
2491              adjust the operand.
2492
2493              Note: we intentionally do not attempt to decode and skip
2494              any ES: prefix, as adding ES: means the addr16 (likely)
2495              no longer points to saddr/sfr space.
2496           */
2497
2498           int is_sfr;
2499           int is_saddr;
2500           int idx;
2501           int poff;
2502
2503           GET_RELOC;
2504
2505           if (0xffe20 <= symval && symval <= 0xfffff)
2506             {
2507
2508               is_saddr = (0xffe20 <= symval && symval <= 0xfff1f);
2509               is_sfr   = (0xfff00 <= symval && symval <= 0xfffff);
2510
2511               for (idx = 0; relax_addr16[idx].insn != -1; idx ++)
2512                 {
2513                   if (relax_addr16[idx].prefix != -1
2514                       && insn[0] == relax_addr16[idx].prefix
2515                       && insn[1] == relax_addr16[idx].insn)
2516                     {
2517                       poff = 1;
2518                     }
2519                   else if (relax_addr16[idx].prefix == -1
2520                            && insn[0] == relax_addr16[idx].insn)
2521                     {
2522                       poff = 0;
2523                     }
2524                   else
2525                     continue;
2526
2527                   /* We have a matched insn, and poff is 0 or 1 depending
2528                      on the base pattern size.  */
2529
2530                   if (is_sfr && relax_addr16[idx].insn_for_sfr != -1)
2531                     {
2532                       insn[poff] = relax_addr16[idx].insn_for_sfr;
2533                       SNIP (poff+2, 1, R_RL78_RH_SFR);
2534                     }
2535
2536                   else if  (is_saddr && relax_addr16[idx].insn_for_saddr != -1)
2537                     {
2538                       insn[poff] = relax_addr16[idx].insn_for_saddr;
2539                       SNIP (poff+2, 1, R_RL78_RH_SADDR);
2540                     }
2541                 }
2542             }
2543         }
2544       /*----------------------------------------------------------------------*/
2545     }
2546
2547   return TRUE;
2548
2549  error_return:
2550   if (free_relocs != NULL)
2551     free (free_relocs);
2552
2553   if (free_contents != NULL)
2554     free (free_contents);
2555
2556   if (shndx_buf != NULL)
2557     {
2558       shndx_hdr->contents = NULL;
2559       free (shndx_buf);
2560     }
2561
2562   if (free_intsyms != NULL)
2563     free (free_intsyms);
2564
2565   return TRUE;
2566 }
2567
2568 \f
2569
2570 #define ELF_ARCH                bfd_arch_rl78
2571 #define ELF_MACHINE_CODE        EM_RL78
2572 #define ELF_MAXPAGESIZE         0x1000
2573
2574 #define TARGET_LITTLE_SYM       rl78_elf32_vec
2575 #define TARGET_LITTLE_NAME      "elf32-rl78"
2576
2577 #define elf_info_to_howto_rel                   NULL
2578 #define elf_info_to_howto                       rl78_info_to_howto_rela
2579 #define elf_backend_object_p                    rl78_elf_object_p
2580 #define elf_backend_relocate_section            rl78_elf_relocate_section
2581 #define elf_symbol_leading_char                 ('_')
2582 #define elf_backend_can_gc_sections             1
2583
2584 #define bfd_elf32_bfd_reloc_type_lookup         rl78_reloc_type_lookup
2585 #define bfd_elf32_bfd_reloc_name_lookup         rl78_reloc_name_lookup
2586 #define bfd_elf32_bfd_set_private_flags         rl78_elf_set_private_flags
2587 #define bfd_elf32_bfd_merge_private_bfd_data    rl78_elf_merge_private_bfd_data
2588 #define bfd_elf32_bfd_print_private_bfd_data    rl78_elf_print_private_bfd_data
2589
2590 #define bfd_elf32_bfd_relax_section             rl78_elf_relax_section
2591 #define elf_backend_check_relocs                rl78_elf_check_relocs
2592 #define elf_backend_always_size_sections \
2593   rl78_elf_always_size_sections
2594 #define elf_backend_finish_dynamic_sections \
2595   rl78_elf_finish_dynamic_sections
2596
2597 #include "elf32-target.h"