OSDN Git Service

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