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