MIPS/LD: Accept high-part relocations in PIC code with absolute symbols
[external/binutils.git] / bfd / elf32-rx.c
1 /* Renesas RX specific support for 32-bit ELF.
2    Copyright (C) 2008-2018 Free Software Foundation, Inc.
3
4    This file is part of BFD, the Binary File Descriptor library.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20
21 #include "sysdep.h"
22 #include "bfd.h"
23 #include "bfd_stdint.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf/rx.h"
27 #include "libiberty.h"
28 #include "elf32-rx.h"
29
30 #define RX_OPCODE_BIG_ENDIAN 0
31
32 /* This is a meta-target that's used only with objcopy, to avoid the
33    endian-swap we would otherwise get.  We check for this in
34    rx_elf_object_p().  */
35 const bfd_target rx_elf32_be_ns_vec;
36 const bfd_target rx_elf32_be_vec;
37
38 #ifdef DEBUG
39 char * rx_get_reloc (long);
40 void rx_dump_symtab (bfd *, void *, void *);
41 #endif
42
43 #define RXREL(n,sz,bit,shift,complain,pcrel)                                 \
44   HOWTO (R_RX_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
45          bfd_elf_generic_reloc, "R_RX_" #n, FALSE, 0, ~0, FALSE)
46
47 /* Note that the relocations around 0x7f are internal to this file;
48    feel free to move them as needed to avoid conflicts with published
49    relocation numbers.  */
50
51 static reloc_howto_type rx_elf_howto_table [] =
52 {
53   RXREL (NONE,         3,  0, 0, dont,     FALSE),
54   RXREL (DIR32,        2, 32, 0, signed,   FALSE),
55   RXREL (DIR24S,       2, 24, 0, signed,   FALSE),
56   RXREL (DIR16,        1, 16, 0, dont,     FALSE),
57   RXREL (DIR16U,       1, 16, 0, unsigned, FALSE),
58   RXREL (DIR16S,       1, 16, 0, signed,   FALSE),
59   RXREL (DIR8,         0,  8, 0, dont,     FALSE),
60   RXREL (DIR8U,        0,  8, 0, unsigned, FALSE),
61   RXREL (DIR8S,        0,  8, 0, signed,   FALSE),
62   RXREL (DIR24S_PCREL, 2, 24, 0, signed,   TRUE),
63   RXREL (DIR16S_PCREL, 1, 16, 0, signed,   TRUE),
64   RXREL (DIR8S_PCREL,  0,  8, 0, signed,   TRUE),
65   RXREL (DIR16UL,      1, 16, 2, unsigned, FALSE),
66   RXREL (DIR16UW,      1, 16, 1, unsigned, FALSE),
67   RXREL (DIR8UL,       0,  8, 2, unsigned, FALSE),
68   RXREL (DIR8UW,       0,  8, 1, unsigned, FALSE),
69   RXREL (DIR32_REV,    1, 16, 0, dont,     FALSE),
70   RXREL (DIR16_REV,    1, 16, 0, dont,     FALSE),
71   RXREL (DIR3U_PCREL,  0,  3, 0, dont,     TRUE),
72
73   EMPTY_HOWTO (0x13),
74   EMPTY_HOWTO (0x14),
75   EMPTY_HOWTO (0x15),
76   EMPTY_HOWTO (0x16),
77   EMPTY_HOWTO (0x17),
78   EMPTY_HOWTO (0x18),
79   EMPTY_HOWTO (0x19),
80   EMPTY_HOWTO (0x1a),
81   EMPTY_HOWTO (0x1b),
82   EMPTY_HOWTO (0x1c),
83   EMPTY_HOWTO (0x1d),
84   EMPTY_HOWTO (0x1e),
85   EMPTY_HOWTO (0x1f),
86
87   RXREL (RH_3_PCREL, 0,  3, 0, signed,   TRUE),
88   RXREL (RH_16_OP,   1, 16, 0, signed,   FALSE),
89   RXREL (RH_24_OP,   2, 24, 0, signed,   FALSE),
90   RXREL (RH_32_OP,   2, 32, 0, signed,   FALSE),
91   RXREL (RH_24_UNS,  2, 24, 0, unsigned, FALSE),
92   RXREL (RH_8_NEG,   0,  8, 0, signed,   FALSE),
93   RXREL (RH_16_NEG,  1, 16, 0, signed,   FALSE),
94   RXREL (RH_24_NEG,  2, 24, 0, signed,   FALSE),
95   RXREL (RH_32_NEG,  2, 32, 0, signed,   FALSE),
96   RXREL (RH_DIFF,    2, 32, 0, signed,   FALSE),
97   RXREL (RH_GPRELB,  1, 16, 0, unsigned, FALSE),
98   RXREL (RH_GPRELW,  1, 16, 0, unsigned, FALSE),
99   RXREL (RH_GPRELL,  1, 16, 0, unsigned, FALSE),
100   RXREL (RH_RELAX,   0,  0, 0, dont,     FALSE),
101
102   EMPTY_HOWTO (0x2e),
103   EMPTY_HOWTO (0x2f),
104   EMPTY_HOWTO (0x30),
105   EMPTY_HOWTO (0x31),
106   EMPTY_HOWTO (0x32),
107   EMPTY_HOWTO (0x33),
108   EMPTY_HOWTO (0x34),
109   EMPTY_HOWTO (0x35),
110   EMPTY_HOWTO (0x36),
111   EMPTY_HOWTO (0x37),
112   EMPTY_HOWTO (0x38),
113   EMPTY_HOWTO (0x39),
114   EMPTY_HOWTO (0x3a),
115   EMPTY_HOWTO (0x3b),
116   EMPTY_HOWTO (0x3c),
117   EMPTY_HOWTO (0x3d),
118   EMPTY_HOWTO (0x3e),
119   EMPTY_HOWTO (0x3f),
120   EMPTY_HOWTO (0x40),
121
122   RXREL (ABS32,        2, 32, 0, dont,     FALSE),
123   RXREL (ABS24S,       2, 24, 0, signed,   FALSE),
124   RXREL (ABS16,        1, 16, 0, dont,     FALSE),
125   RXREL (ABS16U,       1, 16, 0, unsigned, FALSE),
126   RXREL (ABS16S,       1, 16, 0, signed,   FALSE),
127   RXREL (ABS8,         0,  8, 0, dont,     FALSE),
128   RXREL (ABS8U,        0,  8, 0, unsigned, FALSE),
129   RXREL (ABS8S,        0,  8, 0, signed,   FALSE),
130   RXREL (ABS24S_PCREL, 2, 24, 0, signed,   TRUE),
131   RXREL (ABS16S_PCREL, 1, 16, 0, signed,   TRUE),
132   RXREL (ABS8S_PCREL,  0,  8, 0, signed,   TRUE),
133   RXREL (ABS16UL,      1, 16, 0, unsigned, FALSE),
134   RXREL (ABS16UW,      1, 16, 0, unsigned, FALSE),
135   RXREL (ABS8UL,       0,  8, 0, unsigned, FALSE),
136   RXREL (ABS8UW,       0,  8, 0, unsigned, FALSE),
137   RXREL (ABS32_REV,    2, 32, 0, dont,     FALSE),
138   RXREL (ABS16_REV,    1, 16, 0, dont,     FALSE),
139
140 #define STACK_REL_P(x) ((x) <= R_RX_ABS16_REV && (x) >= R_RX_ABS32)
141
142   EMPTY_HOWTO (0x52),
143   EMPTY_HOWTO (0x53),
144   EMPTY_HOWTO (0x54),
145   EMPTY_HOWTO (0x55),
146   EMPTY_HOWTO (0x56),
147   EMPTY_HOWTO (0x57),
148   EMPTY_HOWTO (0x58),
149   EMPTY_HOWTO (0x59),
150   EMPTY_HOWTO (0x5a),
151   EMPTY_HOWTO (0x5b),
152   EMPTY_HOWTO (0x5c),
153   EMPTY_HOWTO (0x5d),
154   EMPTY_HOWTO (0x5e),
155   EMPTY_HOWTO (0x5f),
156   EMPTY_HOWTO (0x60),
157   EMPTY_HOWTO (0x61),
158   EMPTY_HOWTO (0x62),
159   EMPTY_HOWTO (0x63),
160   EMPTY_HOWTO (0x64),
161   EMPTY_HOWTO (0x65),
162   EMPTY_HOWTO (0x66),
163   EMPTY_HOWTO (0x67),
164   EMPTY_HOWTO (0x68),
165   EMPTY_HOWTO (0x69),
166   EMPTY_HOWTO (0x6a),
167   EMPTY_HOWTO (0x6b),
168   EMPTY_HOWTO (0x6c),
169   EMPTY_HOWTO (0x6d),
170   EMPTY_HOWTO (0x6e),
171   EMPTY_HOWTO (0x6f),
172   EMPTY_HOWTO (0x70),
173   EMPTY_HOWTO (0x71),
174   EMPTY_HOWTO (0x72),
175   EMPTY_HOWTO (0x73),
176   EMPTY_HOWTO (0x74),
177   EMPTY_HOWTO (0x75),
178   EMPTY_HOWTO (0x76),
179   EMPTY_HOWTO (0x77),
180
181   /* These are internal.  */
182   /* A 5-bit unsigned displacement to a B/W/L address, at bit position 8/12.  */
183   /* ---- ----   4--- 3210.  */
184 #define R_RX_RH_ABS5p8B 0x78
185   RXREL (RH_ABS5p8B,   0,  0, 0, dont,     FALSE),
186 #define R_RX_RH_ABS5p8W 0x79
187   RXREL (RH_ABS5p8W,   0,  0, 0, dont,     FALSE),
188 #define R_RX_RH_ABS5p8L 0x7a
189   RXREL (RH_ABS5p8L,   0,  0, 0, dont,     FALSE),
190   /* A 5-bit unsigned displacement to a B/W/L address, at bit position 5/12.  */
191   /* ---- -432   1--- 0---.  */
192 #define R_RX_RH_ABS5p5B 0x7b
193   RXREL (RH_ABS5p5B,   0,  0, 0, dont,     FALSE),
194 #define R_RX_RH_ABS5p5W 0x7c
195   RXREL (RH_ABS5p5W,   0,  0, 0, dont,     FALSE),
196 #define R_RX_RH_ABS5p5L 0x7d
197   RXREL (RH_ABS5p5L,   0,  0, 0, dont,     FALSE),
198   /* A 4-bit unsigned immediate at bit position 8.  */
199 #define R_RX_RH_UIMM4p8 0x7e
200   RXREL (RH_UIMM4p8,   0,  0, 0, dont,     FALSE),
201   /* A 4-bit negative unsigned immediate at bit position 8.  */
202 #define R_RX_RH_UNEG4p8 0x7f
203   RXREL (RH_UNEG4p8,   0,  0, 0, dont,     FALSE),
204   /* End of internal relocs.  */
205
206   RXREL (SYM,       2, 32, 0, dont, FALSE),
207   RXREL (OPneg,     2, 32, 0, dont, FALSE),
208   RXREL (OPadd,     2, 32, 0, dont, FALSE),
209   RXREL (OPsub,     2, 32, 0, dont, FALSE),
210   RXREL (OPmul,     2, 32, 0, dont, FALSE),
211   RXREL (OPdiv,     2, 32, 0, dont, FALSE),
212   RXREL (OPshla,    2, 32, 0, dont, FALSE),
213   RXREL (OPshra,    2, 32, 0, dont, FALSE),
214   RXREL (OPsctsize, 2, 32, 0, dont, FALSE),
215   RXREL (OPscttop,  2, 32, 0, dont, FALSE),
216   RXREL (OPand,     2, 32, 0, dont, FALSE),
217   RXREL (OPor,      2, 32, 0, dont, FALSE),
218   RXREL (OPxor,     2, 32, 0, dont, FALSE),
219   RXREL (OPnot,     2, 32, 0, dont, FALSE),
220   RXREL (OPmod,     2, 32, 0, dont, FALSE),
221   RXREL (OPromtop,  2, 32, 0, dont, FALSE),
222   RXREL (OPramtop,  2, 32, 0, dont, FALSE)
223 };
224 \f
225 /* Map BFD reloc types to RX ELF reloc types.  */
226
227 struct rx_reloc_map
228 {
229   bfd_reloc_code_real_type  bfd_reloc_val;
230   unsigned int              rx_reloc_val;
231 };
232
233 static const struct rx_reloc_map rx_reloc_map [] =
234 {
235   { BFD_RELOC_NONE,             R_RX_NONE },
236   { BFD_RELOC_8,                R_RX_DIR8S },
237   { BFD_RELOC_16,               R_RX_DIR16S },
238   { BFD_RELOC_24,               R_RX_DIR24S },
239   { BFD_RELOC_32,               R_RX_DIR32 },
240   { BFD_RELOC_RX_16_OP,         R_RX_DIR16 },
241   { BFD_RELOC_RX_DIR3U_PCREL,   R_RX_DIR3U_PCREL },
242   { BFD_RELOC_8_PCREL,          R_RX_DIR8S_PCREL },
243   { BFD_RELOC_16_PCREL,         R_RX_DIR16S_PCREL },
244   { BFD_RELOC_24_PCREL,         R_RX_DIR24S_PCREL },
245   { BFD_RELOC_RX_8U,            R_RX_DIR8U },
246   { BFD_RELOC_RX_16U,           R_RX_DIR16U },
247   { BFD_RELOC_RX_24U,           R_RX_RH_24_UNS },
248   { BFD_RELOC_RX_NEG8,          R_RX_RH_8_NEG },
249   { BFD_RELOC_RX_NEG16,         R_RX_RH_16_NEG },
250   { BFD_RELOC_RX_NEG24,         R_RX_RH_24_NEG },
251   { BFD_RELOC_RX_NEG32,         R_RX_RH_32_NEG },
252   { BFD_RELOC_RX_DIFF,          R_RX_RH_DIFF },
253   { BFD_RELOC_RX_GPRELB,        R_RX_RH_GPRELB },
254   { BFD_RELOC_RX_GPRELW,        R_RX_RH_GPRELW },
255   { BFD_RELOC_RX_GPRELL,        R_RX_RH_GPRELL },
256   { BFD_RELOC_RX_RELAX,         R_RX_RH_RELAX },
257   { BFD_RELOC_RX_SYM,           R_RX_SYM },
258   { BFD_RELOC_RX_OP_SUBTRACT,   R_RX_OPsub },
259   { BFD_RELOC_RX_OP_NEG,        R_RX_OPneg },
260   { BFD_RELOC_RX_ABS8,          R_RX_ABS8 },
261   { BFD_RELOC_RX_ABS16,         R_RX_ABS16 },
262   { BFD_RELOC_RX_ABS16_REV,     R_RX_ABS16_REV },
263   { BFD_RELOC_RX_ABS32,         R_RX_ABS32 },
264   { BFD_RELOC_RX_ABS32_REV,     R_RX_ABS32_REV },
265   { BFD_RELOC_RX_ABS16UL,       R_RX_ABS16UL },
266   { BFD_RELOC_RX_ABS16UW,       R_RX_ABS16UW },
267   { BFD_RELOC_RX_ABS16U,        R_RX_ABS16U }
268 };
269
270 #define BIGE(abfd)       ((abfd)->xvec->byteorder == BFD_ENDIAN_BIG)
271
272 static reloc_howto_type *
273 rx_reloc_type_lookup (bfd *                    abfd ATTRIBUTE_UNUSED,
274                       bfd_reloc_code_real_type code)
275 {
276   unsigned int i;
277
278   if (code == BFD_RELOC_RX_32_OP)
279     return rx_elf_howto_table + R_RX_DIR32;
280
281   for (i = ARRAY_SIZE (rx_reloc_map); i--;)
282     if (rx_reloc_map [i].bfd_reloc_val == code)
283       return rx_elf_howto_table + rx_reloc_map[i].rx_reloc_val;
284
285   return NULL;
286 }
287
288 static reloc_howto_type *
289 rx_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED, const char * r_name)
290 {
291   unsigned int i;
292
293   for (i = 0; i < ARRAY_SIZE (rx_elf_howto_table); i++)
294     if (rx_elf_howto_table[i].name != NULL
295         && strcasecmp (rx_elf_howto_table[i].name, r_name) == 0)
296       return rx_elf_howto_table + i;
297
298   return NULL;
299 }
300
301 /* Set the howto pointer for an RX ELF reloc.  */
302
303 static bfd_boolean
304 rx_info_to_howto_rela (bfd *               abfd,
305                        arelent *           cache_ptr,
306                        Elf_Internal_Rela * dst)
307 {
308   unsigned int r_type;
309
310   r_type = ELF32_R_TYPE (dst->r_info);
311   if (r_type >= (unsigned int) R_RX_max)
312     {
313       /* xgettext:c-format */
314       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
315                           abfd, r_type);
316       bfd_set_error (bfd_error_bad_value);
317       return FALSE;
318     }
319   cache_ptr->howto = rx_elf_howto_table + r_type;
320   if (cache_ptr->howto->name == NULL)
321     {
322       /* xgettext:c-format */
323       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
324                           abfd, r_type);
325       bfd_set_error (bfd_error_bad_value);
326       return FALSE;
327     }
328   return TRUE;
329 }
330 \f
331 static bfd_vma
332 get_symbol_value (const char *            name,
333                   struct bfd_link_info *  info,
334                   bfd *                   input_bfd,
335                   asection *              input_section,
336                   int                     offset)
337 {
338   bfd_vma value = 0;
339   struct bfd_link_hash_entry * h;
340
341   h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
342
343   if (h == NULL
344       || (h->type != bfd_link_hash_defined
345           && h->type != bfd_link_hash_defweak))
346     (*info->callbacks->undefined_symbol)
347       (info, name, input_bfd, input_section, offset, TRUE);
348   else
349     value = (h->u.def.value
350              + h->u.def.section->output_section->vma
351              + h->u.def.section->output_offset);
352
353   return value;
354 }
355
356 static bfd_vma
357 get_symbol_value_maybe (const char *            name,
358                         struct bfd_link_info *  info)
359 {
360   bfd_vma value = 0;
361   struct bfd_link_hash_entry * h;
362
363   h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
364
365   if (h == NULL
366       || (h->type != bfd_link_hash_defined
367           && h->type != bfd_link_hash_defweak))
368     return 0;
369   else
370     value = (h->u.def.value
371              + h->u.def.section->output_section->vma
372              + h->u.def.section->output_offset);
373
374   return value;
375 }
376
377 static bfd_vma
378 get_gp (struct bfd_link_info *  info,
379         bfd *                   abfd,
380         asection *              sec,
381         int                     offset)
382 {
383   static bfd_boolean cached = FALSE;
384   static bfd_vma     cached_value = 0;
385
386   if (!cached)
387     {
388       cached_value = get_symbol_value ("__gp", info, abfd, sec, offset);
389       cached = TRUE;
390     }
391   return cached_value;
392 }
393
394 static bfd_vma
395 get_romstart (struct bfd_link_info *  info,
396               bfd *                   abfd,
397               asection *              sec,
398               int                     offset)
399 {
400   static bfd_boolean cached = FALSE;
401   static bfd_vma     cached_value = 0;
402
403   if (!cached)
404     {
405       cached_value = get_symbol_value ("_start", info, abfd, sec, offset);
406       cached = TRUE;
407     }
408   return cached_value;
409 }
410
411 static bfd_vma
412 get_ramstart (struct bfd_link_info *  info,
413               bfd *                   abfd,
414               asection *              sec,
415               int                     offset)
416 {
417   static bfd_boolean cached = FALSE;
418   static bfd_vma     cached_value = 0;
419
420   if (!cached)
421     {
422       cached_value = get_symbol_value ("__datastart", info, abfd, sec, offset);
423       cached = TRUE;
424     }
425   return cached_value;
426 }
427
428 #define NUM_STACK_ENTRIES 16
429 static int32_t rx_stack [ NUM_STACK_ENTRIES ];
430 static unsigned int rx_stack_top;
431
432 #define RX_STACK_PUSH(val)                      \
433   do                                            \
434     {                                           \
435       if (rx_stack_top < NUM_STACK_ENTRIES)     \
436         rx_stack [rx_stack_top ++] = (val);     \
437       else                                      \
438         r = bfd_reloc_dangerous;                \
439     }                                           \
440   while (0)
441
442 #define RX_STACK_POP(dest)                      \
443   do                                            \
444     {                                           \
445       if (rx_stack_top > 0)                     \
446         (dest) = rx_stack [-- rx_stack_top];    \
447       else                                      \
448         (dest) = 0, r = bfd_reloc_dangerous;    \
449     }                                           \
450   while (0)
451
452 /* Relocate an RX ELF section.
453    There is some attempt to make this function usable for many architectures,
454    both USE_REL and USE_RELA ['twould be nice if such a critter existed],
455    if only to serve as a learning tool.
456
457    The RELOCATE_SECTION function is called by the new ELF backend linker
458    to handle the relocations for a section.
459
460    The relocs are always passed as Rela structures; if the section
461    actually uses Rel structures, the r_addend field will always be
462    zero.
463
464    This function is responsible for adjusting the section contents as
465    necessary, and (if using Rela relocs and generating a relocatable
466    output file) adjusting the reloc addend as necessary.
467
468    This function does not have to worry about setting the reloc
469    address or the reloc symbol index.
470
471    LOCAL_SYMS is a pointer to the swapped in local symbols.
472
473    LOCAL_SECTIONS is an array giving the section in the input file
474    corresponding to the st_shndx field of each local symbol.
475
476    The global hash table entry for the global symbols can be found
477    via elf_sym_hashes (input_bfd).
478
479    When generating relocatable output, this function must handle
480    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
481    going to be the section symbol corresponding to the output
482    section, which means that the addend must be adjusted
483    accordingly.  */
484
485 static bfd_boolean
486 rx_elf_relocate_section
487     (bfd *                   output_bfd,
488      struct bfd_link_info *  info,
489      bfd *                   input_bfd,
490      asection *              input_section,
491      bfd_byte *              contents,
492      Elf_Internal_Rela *     relocs,
493      Elf_Internal_Sym *      local_syms,
494      asection **             local_sections)
495 {
496   Elf_Internal_Shdr *           symtab_hdr;
497   struct elf_link_hash_entry ** sym_hashes;
498   Elf_Internal_Rela *           rel;
499   Elf_Internal_Rela *           relend;
500   bfd_boolean                   pid_mode;
501   bfd_boolean                   saw_subtract = FALSE;
502   const char *                  table_default_cache = NULL;
503   bfd_vma                       table_start_cache = 0;
504   bfd_vma                       table_end_cache = 0;
505
506   if (elf_elfheader (output_bfd)->e_flags & E_FLAG_RX_PID)
507     pid_mode = TRUE;
508   else
509     pid_mode = FALSE;
510
511   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
512   sym_hashes = elf_sym_hashes (input_bfd);
513   relend     = relocs + input_section->reloc_count;
514   for (rel = relocs; rel < relend; rel ++)
515     {
516       reloc_howto_type *           howto;
517       unsigned long                r_symndx;
518       Elf_Internal_Sym *           sym;
519       asection *                   sec;
520       struct elf_link_hash_entry * h;
521       bfd_vma                      relocation;
522       bfd_reloc_status_type        r;
523       const char *                 name = NULL;
524       bfd_boolean                  unresolved_reloc = TRUE;
525       int                          r_type;
526
527       r_type = ELF32_R_TYPE (rel->r_info);
528       r_symndx = ELF32_R_SYM (rel->r_info);
529
530       howto  = rx_elf_howto_table + ELF32_R_TYPE (rel->r_info);
531       h      = NULL;
532       sym    = NULL;
533       sec    = NULL;
534       relocation = 0;
535
536       if (rx_stack_top == 0)
537         saw_subtract = FALSE;
538
539       if (r_symndx < symtab_hdr->sh_info)
540         {
541           sym = local_syms + r_symndx;
542           sec = local_sections [r_symndx];
543           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, & sec, rel);
544
545           name = bfd_elf_string_from_elf_section
546             (input_bfd, symtab_hdr->sh_link, sym->st_name);
547           name = (sym->st_name == 0) ? bfd_section_name (input_bfd, sec) : name;
548         }
549       else
550         {
551           bfd_boolean warned, ignored;
552
553           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
554                                    r_symndx, symtab_hdr, sym_hashes, h,
555                                    sec, relocation, unresolved_reloc,
556                                    warned, ignored);
557
558           name = h->root.root.string;
559         }
560
561       if (strncmp (name, "$tableentry$default$", 20) == 0)
562         {
563           bfd_vma entry_vma;
564           int idx;
565           char *buf;
566
567           if (table_default_cache != name)
568             {
569
570               /* All relocs for a given table should be to the same
571                  (weak) default symbol) so we can use it to detect a
572                  cache miss.  We use the offset into the table to find
573                  the "real" symbol.  Calculate and store the table's
574                  offset here.  */
575
576               table_default_cache = name;
577
578               /* We have already done error checking in rx_table_find().  */
579
580               buf = (char *) malloc (13 + strlen (name + 20));
581
582               sprintf (buf, "$tablestart$%s", name + 20);
583               table_start_cache = get_symbol_value (buf,
584                                                     info,
585                                                     input_bfd,
586                                                     input_section,
587                                                     rel->r_offset);
588
589               sprintf (buf, "$tableend$%s", name + 20);
590               table_end_cache = get_symbol_value (buf,
591                                                   info,
592                                                   input_bfd,
593                                                   input_section,
594                                                   rel->r_offset);
595
596               free (buf);
597             }
598
599           entry_vma = (input_section->output_section->vma
600                        + input_section->output_offset
601                        + rel->r_offset);
602
603           if (table_end_cache <= entry_vma || entry_vma < table_start_cache)
604             {
605               /* xgettext:c-format */
606               _bfd_error_handler (_("%pB:%pA: table entry %s outside table"),
607                                   input_bfd, input_section,
608                                   name);
609             }
610           else if ((int) (entry_vma - table_start_cache) % 4)
611             {
612               /* xgettext:c-format */
613               _bfd_error_handler (_("%pB:%pA: table entry %s not word-aligned within table"),
614                                   input_bfd, input_section,
615                                   name);
616             }
617           else
618             {
619               idx = (int) (entry_vma - table_start_cache) / 4;
620
621               /* This will look like $tableentry$<N>$<name> */
622               buf = (char *) malloc (12 + 20 + strlen (name + 20));
623               sprintf (buf, "$tableentry$%d$%s", idx, name + 20);
624
625               h = (struct elf_link_hash_entry *) bfd_link_hash_lookup (info->hash, buf, FALSE, FALSE, TRUE);
626
627               if (h)
628                 {
629                   relocation = (h->root.u.def.value
630                                 + h->root.u.def.section->output_section->vma
631                                 + h->root.u.def.section->output_offset);;
632                 }
633
634               free (buf);
635             }
636         }
637
638       if (sec != NULL && discarded_section (sec))
639         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
640                                          rel, 1, relend, howto, 0, contents);
641
642       if (bfd_link_relocatable (info))
643         {
644           /* This is a relocatable link.  We don't have to change
645              anything, unless the reloc is against a section symbol,
646              in which case we have to adjust according to where the
647              section symbol winds up in the output section.  */
648           if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
649             rel->r_addend += sec->output_offset;
650           continue;
651         }
652
653       if (h != NULL && h->root.type == bfd_link_hash_undefweak)
654         /* If the symbol is undefined and weak
655            then the relocation resolves to zero.  */
656         relocation = 0;
657       else
658         {
659           if (howto->pc_relative)
660             {
661               relocation -= (input_section->output_section->vma
662                              + input_section->output_offset
663                              + rel->r_offset);
664               if (r_type != R_RX_RH_3_PCREL
665                   && r_type != R_RX_DIR3U_PCREL)
666                 relocation ++;
667             }
668
669           relocation += rel->r_addend;
670         }
671
672       r = bfd_reloc_ok;
673
674 #define RANGE(a,b) \
675   if (a > (long) relocation || (long) relocation > b)           \
676     r = bfd_reloc_overflow
677 #define ALIGN(m) \
678   if (relocation & m)                                           \
679     r = bfd_reloc_other
680 #define OP(i) \
681   (contents[rel->r_offset + (i)])
682 #define WARN_REDHAT(type) \
683   /* xgettext:c-format */                                       \
684   _bfd_error_handler                                            \
685     (_("%pB:%pA: warning: deprecated Red Hat reloc "            \
686        "%s detected against: %s"),                              \
687      input_bfd, input_section, #type, name)
688
689       /* Check for unsafe relocs in PID mode.  These are any relocs where
690          an absolute address is being computed.  There are special cases
691          for relocs against symbols that are known to be referenced in
692          crt0.o before the PID base address register has been initialised.  */
693 #define UNSAFE_FOR_PID                                                  \
694   do                                                                    \
695     {                                                                   \
696       if (pid_mode                                                      \
697           && sec != NULL                                                \
698           && sec->flags & SEC_READONLY                                  \
699           && !(input_section->flags & SEC_DEBUGGING)                    \
700           && strcmp (name, "__pid_base") != 0                           \
701           && strcmp (name, "__gp") != 0                                 \
702           && strcmp (name, "__romdatastart") != 0                       \
703           && !saw_subtract)                                             \
704         /* xgettext:c-format */                                         \
705         _bfd_error_handler (_("%pB(%pA): unsafe PID relocation %s "     \
706                               "at %#" PRIx64 " (against %s in %s)"),    \
707                             input_bfd, input_section, howto->name,      \
708                             (uint64_t) (input_section->output_section->vma \
709                                         + input_section->output_offset  \
710                                         + rel->r_offset),               \
711                             name, sec->name);                           \
712     }                                                                   \
713   while (0)
714
715       /* Opcode relocs are always big endian.  Data relocs are bi-endian.  */
716       switch (r_type)
717         {
718         case R_RX_NONE:
719           break;
720
721         case R_RX_RH_RELAX:
722           break;
723
724         case R_RX_RH_3_PCREL:
725           WARN_REDHAT ("RX_RH_3_PCREL");
726           RANGE (3, 10);
727           OP (0) &= 0xf8;
728           OP (0) |= relocation & 0x07;
729           break;
730
731         case R_RX_RH_8_NEG:
732           WARN_REDHAT ("RX_RH_8_NEG");
733           relocation = - relocation;
734           /* Fall through.  */
735         case R_RX_DIR8S_PCREL:
736           UNSAFE_FOR_PID;
737           RANGE (-128, 127);
738           OP (0) = relocation;
739           break;
740
741         case R_RX_DIR8S:
742           UNSAFE_FOR_PID;
743           RANGE (-128, 255);
744           OP (0) = relocation;
745           break;
746
747         case R_RX_DIR8U:
748           UNSAFE_FOR_PID;
749           RANGE (0, 255);
750           OP (0) = relocation;
751           break;
752
753         case R_RX_RH_16_NEG:
754           WARN_REDHAT ("RX_RH_16_NEG");
755           relocation = - relocation;
756           /* Fall through.  */
757         case R_RX_DIR16S_PCREL:
758           UNSAFE_FOR_PID;
759           RANGE (-32768, 32767);
760 #if RX_OPCODE_BIG_ENDIAN
761 #else
762           OP (0) = relocation;
763           OP (1) = relocation >> 8;
764 #endif
765           break;
766
767         case R_RX_RH_16_OP:
768           WARN_REDHAT ("RX_RH_16_OP");
769           UNSAFE_FOR_PID;
770           RANGE (-32768, 32767);
771 #if RX_OPCODE_BIG_ENDIAN
772           OP (1) = relocation;
773           OP (0) = relocation >> 8;
774 #else
775           OP (0) = relocation;
776           OP (1) = relocation >> 8;
777 #endif
778           break;
779
780         case R_RX_DIR16S:
781           UNSAFE_FOR_PID;
782           RANGE (-32768, 65535);
783           if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
784             {
785               OP (1) = relocation;
786               OP (0) = relocation >> 8;
787             }
788           else
789             {
790               OP (0) = relocation;
791               OP (1) = relocation >> 8;
792             }
793           break;
794
795         case R_RX_DIR16U:
796           UNSAFE_FOR_PID;
797           RANGE (0, 65536);
798 #if RX_OPCODE_BIG_ENDIAN
799           OP (1) = relocation;
800           OP (0) = relocation >> 8;
801 #else
802           OP (0) = relocation;
803           OP (1) = relocation >> 8;
804 #endif
805           break;
806
807         case R_RX_DIR16:
808           UNSAFE_FOR_PID;
809           RANGE (-32768, 65536);
810 #if RX_OPCODE_BIG_ENDIAN
811           OP (1) = relocation;
812           OP (0) = relocation >> 8;
813 #else
814           OP (0) = relocation;
815           OP (1) = relocation >> 8;
816 #endif
817           break;
818
819         case R_RX_DIR16_REV:
820           UNSAFE_FOR_PID;
821           RANGE (-32768, 65536);
822 #if RX_OPCODE_BIG_ENDIAN
823           OP (0) = relocation;
824           OP (1) = relocation >> 8;
825 #else
826           OP (1) = relocation;
827           OP (0) = relocation >> 8;
828 #endif
829           break;
830
831         case R_RX_DIR3U_PCREL:
832           RANGE (3, 10);
833           OP (0) &= 0xf8;
834           OP (0) |= relocation & 0x07;
835           break;
836
837         case R_RX_RH_24_NEG:
838           UNSAFE_FOR_PID;
839           WARN_REDHAT ("RX_RH_24_NEG");
840           relocation = - relocation;
841           /* Fall through.  */
842         case R_RX_DIR24S_PCREL:
843           RANGE (-0x800000, 0x7fffff);
844 #if RX_OPCODE_BIG_ENDIAN
845           OP (2) = relocation;
846           OP (1) = relocation >> 8;
847           OP (0) = relocation >> 16;
848 #else
849           OP (0) = relocation;
850           OP (1) = relocation >> 8;
851           OP (2) = relocation >> 16;
852 #endif
853           break;
854
855         case R_RX_RH_24_OP:
856           UNSAFE_FOR_PID;
857           WARN_REDHAT ("RX_RH_24_OP");
858           RANGE (-0x800000, 0x7fffff);
859 #if RX_OPCODE_BIG_ENDIAN
860           OP (2) = relocation;
861           OP (1) = relocation >> 8;
862           OP (0) = relocation >> 16;
863 #else
864           OP (0) = relocation;
865           OP (1) = relocation >> 8;
866           OP (2) = relocation >> 16;
867 #endif
868           break;
869
870         case R_RX_DIR24S:
871           UNSAFE_FOR_PID;
872           RANGE (-0x800000, 0x7fffff);
873           if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
874             {
875               OP (2) = relocation;
876               OP (1) = relocation >> 8;
877               OP (0) = relocation >> 16;
878             }
879           else
880             {
881               OP (0) = relocation;
882               OP (1) = relocation >> 8;
883               OP (2) = relocation >> 16;
884             }
885           break;
886
887         case R_RX_RH_24_UNS:
888           UNSAFE_FOR_PID;
889           WARN_REDHAT ("RX_RH_24_UNS");
890           RANGE (0, 0xffffff);
891 #if RX_OPCODE_BIG_ENDIAN
892           OP (2) = relocation;
893           OP (1) = relocation >> 8;
894           OP (0) = relocation >> 16;
895 #else
896           OP (0) = relocation;
897           OP (1) = relocation >> 8;
898           OP (2) = relocation >> 16;
899 #endif
900           break;
901
902         case R_RX_RH_32_NEG:
903           UNSAFE_FOR_PID;
904           WARN_REDHAT ("RX_RH_32_NEG");
905           relocation = - relocation;
906 #if RX_OPCODE_BIG_ENDIAN
907           OP (3) = relocation;
908           OP (2) = relocation >> 8;
909           OP (1) = relocation >> 16;
910           OP (0) = relocation >> 24;
911 #else
912           OP (0) = relocation;
913           OP (1) = relocation >> 8;
914           OP (2) = relocation >> 16;
915           OP (3) = relocation >> 24;
916 #endif
917           break;
918
919         case R_RX_RH_32_OP:
920           UNSAFE_FOR_PID;
921           WARN_REDHAT ("RX_RH_32_OP");
922 #if RX_OPCODE_BIG_ENDIAN
923           OP (3) = relocation;
924           OP (2) = relocation >> 8;
925           OP (1) = relocation >> 16;
926           OP (0) = relocation >> 24;
927 #else
928           OP (0) = relocation;
929           OP (1) = relocation >> 8;
930           OP (2) = relocation >> 16;
931           OP (3) = relocation >> 24;
932 #endif
933           break;
934
935         case R_RX_DIR32:
936           if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
937             {
938               OP (3) = relocation;
939               OP (2) = relocation >> 8;
940               OP (1) = relocation >> 16;
941               OP (0) = relocation >> 24;
942             }
943           else
944             {
945               OP (0) = relocation;
946               OP (1) = relocation >> 8;
947               OP (2) = relocation >> 16;
948               OP (3) = relocation >> 24;
949             }
950           break;
951
952         case R_RX_DIR32_REV:
953           if (BIGE (output_bfd))
954             {
955               OP (0) = relocation;
956               OP (1) = relocation >> 8;
957               OP (2) = relocation >> 16;
958               OP (3) = relocation >> 24;
959             }
960           else
961             {
962               OP (3) = relocation;
963               OP (2) = relocation >> 8;
964               OP (1) = relocation >> 16;
965               OP (0) = relocation >> 24;
966             }
967           break;
968
969         case R_RX_RH_DIFF:
970           {
971             bfd_vma val;
972             WARN_REDHAT ("RX_RH_DIFF");
973             val = bfd_get_32 (output_bfd, & OP (0));
974             val -= relocation;
975             bfd_put_32 (output_bfd, val, & OP (0));
976           }
977           break;
978
979         case R_RX_RH_GPRELB:
980           WARN_REDHAT ("RX_RH_GPRELB");
981           relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
982           RANGE (0, 65535);
983 #if RX_OPCODE_BIG_ENDIAN
984           OP (1) = relocation;
985           OP (0) = relocation >> 8;
986 #else
987           OP (0) = relocation;
988           OP (1) = relocation >> 8;
989 #endif
990           break;
991
992         case R_RX_RH_GPRELW:
993           WARN_REDHAT ("RX_RH_GPRELW");
994           relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
995           ALIGN (1);
996           relocation >>= 1;
997           RANGE (0, 65535);
998 #if RX_OPCODE_BIG_ENDIAN
999           OP (1) = relocation;
1000           OP (0) = relocation >> 8;
1001 #else
1002           OP (0) = relocation;
1003           OP (1) = relocation >> 8;
1004 #endif
1005           break;
1006
1007         case R_RX_RH_GPRELL:
1008           WARN_REDHAT ("RX_RH_GPRELL");
1009           relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
1010           ALIGN (3);
1011           relocation >>= 2;
1012           RANGE (0, 65535);
1013 #if RX_OPCODE_BIG_ENDIAN
1014           OP (1) = relocation;
1015           OP (0) = relocation >> 8;
1016 #else
1017           OP (0) = relocation;
1018           OP (1) = relocation >> 8;
1019 #endif
1020           break;
1021
1022         /* Internal relocations just for relaxation:  */
1023         case R_RX_RH_ABS5p5B:
1024           RX_STACK_POP (relocation);
1025           RANGE (0, 31);
1026           OP (0) &= 0xf8;
1027           OP (0) |= relocation >> 2;
1028           OP (1) &= 0x77;
1029           OP (1) |= (relocation << 6) & 0x80;
1030           OP (1) |= (relocation << 3) & 0x08;
1031           break;
1032
1033         case R_RX_RH_ABS5p5W:
1034           RX_STACK_POP (relocation);
1035           RANGE (0, 62);
1036           ALIGN (1);
1037           relocation >>= 1;
1038           OP (0) &= 0xf8;
1039           OP (0) |= relocation >> 2;
1040           OP (1) &= 0x77;
1041           OP (1) |= (relocation << 6) & 0x80;
1042           OP (1) |= (relocation << 3) & 0x08;
1043           break;
1044
1045         case R_RX_RH_ABS5p5L:
1046           RX_STACK_POP (relocation);
1047           RANGE (0, 124);
1048           ALIGN (3);
1049           relocation >>= 2;
1050           OP (0) &= 0xf8;
1051           OP (0) |= relocation >> 2;
1052           OP (1) &= 0x77;
1053           OP (1) |= (relocation << 6) & 0x80;
1054           OP (1) |= (relocation << 3) & 0x08;
1055           break;
1056
1057         case R_RX_RH_ABS5p8B:
1058           RX_STACK_POP (relocation);
1059           RANGE (0, 31);
1060           OP (0) &= 0x70;
1061           OP (0) |= (relocation << 3) & 0x80;
1062           OP (0) |= relocation & 0x0f;
1063           break;
1064
1065         case R_RX_RH_ABS5p8W:
1066           RX_STACK_POP (relocation);
1067           RANGE (0, 62);
1068           ALIGN (1);
1069           relocation >>= 1;
1070           OP (0) &= 0x70;
1071           OP (0) |= (relocation << 3) & 0x80;
1072           OP (0) |= relocation & 0x0f;
1073           break;
1074
1075         case R_RX_RH_ABS5p8L:
1076           RX_STACK_POP (relocation);
1077           RANGE (0, 124);
1078           ALIGN (3);
1079           relocation >>= 2;
1080           OP (0) &= 0x70;
1081           OP (0) |= (relocation << 3) & 0x80;
1082           OP (0) |= relocation & 0x0f;
1083           break;
1084
1085         case R_RX_RH_UIMM4p8:
1086           RANGE (0, 15);
1087           OP (0) &= 0x0f;
1088           OP (0) |= relocation << 4;
1089           break;
1090
1091         case R_RX_RH_UNEG4p8:
1092           RANGE (-15, 0);
1093           OP (0) &= 0x0f;
1094           OP (0) |= (-relocation) << 4;
1095           break;
1096
1097           /* Complex reloc handling:  */
1098
1099         case R_RX_ABS32:
1100           UNSAFE_FOR_PID;
1101           RX_STACK_POP (relocation);
1102 #if RX_OPCODE_BIG_ENDIAN
1103           OP (3) = relocation;
1104           OP (2) = relocation >> 8;
1105           OP (1) = relocation >> 16;
1106           OP (0) = relocation >> 24;
1107 #else
1108           OP (0) = relocation;
1109           OP (1) = relocation >> 8;
1110           OP (2) = relocation >> 16;
1111           OP (3) = relocation >> 24;
1112 #endif
1113           break;
1114
1115         case R_RX_ABS32_REV:
1116           UNSAFE_FOR_PID;
1117           RX_STACK_POP (relocation);
1118 #if RX_OPCODE_BIG_ENDIAN
1119           OP (0) = relocation;
1120           OP (1) = relocation >> 8;
1121           OP (2) = relocation >> 16;
1122           OP (3) = relocation >> 24;
1123 #else
1124           OP (3) = relocation;
1125           OP (2) = relocation >> 8;
1126           OP (1) = relocation >> 16;
1127           OP (0) = relocation >> 24;
1128 #endif
1129           break;
1130
1131         case R_RX_ABS24S_PCREL:
1132         case R_RX_ABS24S:
1133           UNSAFE_FOR_PID;
1134           RX_STACK_POP (relocation);
1135           RANGE (-0x800000, 0x7fffff);
1136           if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
1137             {
1138               OP (2) = relocation;
1139               OP (1) = relocation >> 8;
1140               OP (0) = relocation >> 16;
1141             }
1142           else
1143             {
1144               OP (0) = relocation;
1145               OP (1) = relocation >> 8;
1146               OP (2) = relocation >> 16;
1147             }
1148           break;
1149
1150         case R_RX_ABS16:
1151           UNSAFE_FOR_PID;
1152           RX_STACK_POP (relocation);
1153           RANGE (-32768, 65535);
1154 #if RX_OPCODE_BIG_ENDIAN
1155           OP (1) = relocation;
1156           OP (0) = relocation >> 8;
1157 #else
1158           OP (0) = relocation;
1159           OP (1) = relocation >> 8;
1160 #endif
1161           break;
1162
1163         case R_RX_ABS16_REV:
1164           UNSAFE_FOR_PID;
1165           RX_STACK_POP (relocation);
1166           RANGE (-32768, 65535);
1167 #if RX_OPCODE_BIG_ENDIAN
1168           OP (0) = relocation;
1169           OP (1) = relocation >> 8;
1170 #else
1171           OP (1) = relocation;
1172           OP (0) = relocation >> 8;
1173 #endif
1174           break;
1175
1176         case R_RX_ABS16S_PCREL:
1177         case R_RX_ABS16S:
1178           RX_STACK_POP (relocation);
1179           RANGE (-32768, 32767);
1180           if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
1181             {
1182               OP (1) = relocation;
1183               OP (0) = relocation >> 8;
1184             }
1185           else
1186             {
1187               OP (0) = relocation;
1188               OP (1) = relocation >> 8;
1189             }
1190           break;
1191
1192         case R_RX_ABS16U:
1193           UNSAFE_FOR_PID;
1194           RX_STACK_POP (relocation);
1195           RANGE (0, 65536);
1196 #if RX_OPCODE_BIG_ENDIAN
1197           OP (1) = relocation;
1198           OP (0) = relocation >> 8;
1199 #else
1200           OP (0) = relocation;
1201           OP (1) = relocation >> 8;
1202 #endif
1203           break;
1204
1205         case R_RX_ABS16UL:
1206           UNSAFE_FOR_PID;
1207           RX_STACK_POP (relocation);
1208           relocation >>= 2;
1209           RANGE (0, 65536);
1210 #if RX_OPCODE_BIG_ENDIAN
1211           OP (1) = relocation;
1212           OP (0) = relocation >> 8;
1213 #else
1214           OP (0) = relocation;
1215           OP (1) = relocation >> 8;
1216 #endif
1217           break;
1218
1219         case R_RX_ABS16UW:
1220           UNSAFE_FOR_PID;
1221           RX_STACK_POP (relocation);
1222           relocation >>= 1;
1223           RANGE (0, 65536);
1224 #if RX_OPCODE_BIG_ENDIAN
1225           OP (1) = relocation;
1226           OP (0) = relocation >> 8;
1227 #else
1228           OP (0) = relocation;
1229           OP (1) = relocation >> 8;
1230 #endif
1231           break;
1232
1233         case R_RX_ABS8:
1234           UNSAFE_FOR_PID;
1235           RX_STACK_POP (relocation);
1236           RANGE (-128, 255);
1237           OP (0) = relocation;
1238           break;
1239
1240         case R_RX_ABS8U:
1241           UNSAFE_FOR_PID;
1242           RX_STACK_POP (relocation);
1243           RANGE (0, 255);
1244           OP (0) = relocation;
1245           break;
1246
1247         case R_RX_ABS8UL:
1248           UNSAFE_FOR_PID;
1249           RX_STACK_POP (relocation);
1250           relocation >>= 2;
1251           RANGE (0, 255);
1252           OP (0) = relocation;
1253           break;
1254
1255         case R_RX_ABS8UW:
1256           UNSAFE_FOR_PID;
1257           RX_STACK_POP (relocation);
1258           relocation >>= 1;
1259           RANGE (0, 255);
1260           OP (0) = relocation;
1261           break;
1262
1263         case R_RX_ABS8S:
1264           UNSAFE_FOR_PID;
1265           /* Fall through.  */
1266         case R_RX_ABS8S_PCREL:
1267           RX_STACK_POP (relocation);
1268           RANGE (-128, 127);
1269           OP (0) = relocation;
1270           break;
1271
1272         case R_RX_SYM:
1273           if (r_symndx < symtab_hdr->sh_info)
1274             RX_STACK_PUSH (sec->output_section->vma
1275                            + sec->output_offset
1276                            + sym->st_value
1277                            + rel->r_addend);
1278           else
1279             {
1280               if (h != NULL
1281                   && (h->root.type == bfd_link_hash_defined
1282                       || h->root.type == bfd_link_hash_defweak))
1283                 RX_STACK_PUSH (h->root.u.def.value
1284                                + sec->output_section->vma
1285                                + sec->output_offset
1286                                + rel->r_addend);
1287               else
1288                 _bfd_error_handler
1289                   (_("warning: RX_SYM reloc with an unknown symbol"));
1290             }
1291           break;
1292
1293         case R_RX_OPneg:
1294           {
1295             int32_t tmp;
1296
1297             saw_subtract = TRUE;
1298             RX_STACK_POP (tmp);
1299             tmp = - tmp;
1300             RX_STACK_PUSH (tmp);
1301           }
1302           break;
1303
1304         case R_RX_OPadd:
1305           {
1306             int32_t tmp1, tmp2;
1307
1308             RX_STACK_POP (tmp1);
1309             RX_STACK_POP (tmp2);
1310             tmp1 += tmp2;
1311             RX_STACK_PUSH (tmp1);
1312           }
1313           break;
1314
1315         case R_RX_OPsub:
1316           {
1317             int32_t tmp1, tmp2;
1318
1319             saw_subtract = TRUE;
1320             RX_STACK_POP (tmp1);
1321             RX_STACK_POP (tmp2);
1322             tmp2 -= tmp1;
1323             RX_STACK_PUSH (tmp2);
1324           }
1325           break;
1326
1327         case R_RX_OPmul:
1328           {
1329             int32_t tmp1, tmp2;
1330
1331             RX_STACK_POP (tmp1);
1332             RX_STACK_POP (tmp2);
1333             tmp1 *= tmp2;
1334             RX_STACK_PUSH (tmp1);
1335           }
1336           break;
1337
1338         case R_RX_OPdiv:
1339           {
1340             int32_t tmp1, tmp2;
1341
1342             RX_STACK_POP (tmp1);
1343             RX_STACK_POP (tmp2);
1344             tmp1 /= tmp2;
1345             RX_STACK_PUSH (tmp1);
1346           }
1347           break;
1348
1349         case R_RX_OPshla:
1350           {
1351             int32_t tmp1, tmp2;
1352
1353             RX_STACK_POP (tmp1);
1354             RX_STACK_POP (tmp2);
1355             tmp1 <<= tmp2;
1356             RX_STACK_PUSH (tmp1);
1357           }
1358           break;
1359
1360         case R_RX_OPshra:
1361           {
1362             int32_t tmp1, tmp2;
1363
1364             RX_STACK_POP (tmp1);
1365             RX_STACK_POP (tmp2);
1366             tmp1 >>= tmp2;
1367             RX_STACK_PUSH (tmp1);
1368           }
1369           break;
1370
1371         case R_RX_OPsctsize:
1372           RX_STACK_PUSH (input_section->size);
1373           break;
1374
1375         case R_RX_OPscttop:
1376           RX_STACK_PUSH (input_section->output_section->vma);
1377           break;
1378
1379         case R_RX_OPand:
1380           {
1381             int32_t tmp1, tmp2;
1382
1383             RX_STACK_POP (tmp1);
1384             RX_STACK_POP (tmp2);
1385             tmp1 &= tmp2;
1386             RX_STACK_PUSH (tmp1);
1387           }
1388           break;
1389
1390         case R_RX_OPor:
1391           {
1392             int32_t tmp1, tmp2;
1393
1394             RX_STACK_POP (tmp1);
1395             RX_STACK_POP (tmp2);
1396             tmp1 |= tmp2;
1397             RX_STACK_PUSH (tmp1);
1398           }
1399           break;
1400
1401         case R_RX_OPxor:
1402           {
1403             int32_t tmp1, tmp2;
1404
1405             RX_STACK_POP (tmp1);
1406             RX_STACK_POP (tmp2);
1407             tmp1 ^= tmp2;
1408             RX_STACK_PUSH (tmp1);
1409           }
1410           break;
1411
1412         case R_RX_OPnot:
1413           {
1414             int32_t tmp;
1415
1416             RX_STACK_POP (tmp);
1417             tmp = ~ tmp;
1418             RX_STACK_PUSH (tmp);
1419           }
1420           break;
1421
1422         case R_RX_OPmod:
1423           {
1424             int32_t tmp1, tmp2;
1425
1426             RX_STACK_POP (tmp1);
1427             RX_STACK_POP (tmp2);
1428             tmp1 %= tmp2;
1429             RX_STACK_PUSH (tmp1);
1430           }
1431           break;
1432
1433         case R_RX_OPromtop:
1434           RX_STACK_PUSH (get_romstart (info, input_bfd, input_section, rel->r_offset));
1435           break;
1436
1437         case R_RX_OPramtop:
1438           RX_STACK_PUSH (get_ramstart (info, input_bfd, input_section, rel->r_offset));
1439           break;
1440
1441         default:
1442           r = bfd_reloc_notsupported;
1443           break;
1444         }
1445
1446       if (r != bfd_reloc_ok)
1447         {
1448           const char * msg = NULL;
1449
1450           switch (r)
1451             {
1452             case bfd_reloc_overflow:
1453               /* Catch the case of a missing function declaration
1454                  and emit a more helpful error message.  */
1455               if (r_type == R_RX_DIR24S_PCREL)
1456                 /* xgettext:c-format */
1457                 msg = _("%pB(%pA): error: call to undefined function '%s'");
1458               else
1459                 (*info->callbacks->reloc_overflow)
1460                   (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
1461                    input_bfd, input_section, rel->r_offset);
1462               break;
1463
1464             case bfd_reloc_undefined:
1465               (*info->callbacks->undefined_symbol)
1466                 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1467               break;
1468
1469             case bfd_reloc_other:
1470               /* xgettext:c-format */
1471               msg = _("%pB(%pA): warning: unaligned access to symbol '%s' in the small data area");
1472               break;
1473
1474             case bfd_reloc_outofrange:
1475               /* xgettext:c-format */
1476               msg = _("%pB(%pA): internal error: out of range error");
1477               break;
1478
1479             case bfd_reloc_notsupported:
1480               /* xgettext:c-format */
1481               msg = _("%pB(%pA): internal error: unsupported relocation error");
1482               break;
1483
1484             case bfd_reloc_dangerous:
1485               /* xgettext:c-format */
1486               msg = _("%pB(%pA): internal error: dangerous relocation");
1487               break;
1488
1489             default:
1490               /* xgettext:c-format */
1491               msg = _("%pB(%pA): internal error: unknown error");
1492               break;
1493             }
1494
1495           if (msg)
1496             _bfd_error_handler (msg, input_bfd, input_section, name);
1497         }
1498     }
1499
1500   return TRUE;
1501 }
1502 \f
1503 /* Relaxation Support.  */
1504
1505 /* Progression of relocations from largest operand size to smallest
1506    operand size.  */
1507
1508 static int
1509 next_smaller_reloc (int r)
1510 {
1511   switch (r)
1512     {
1513     case R_RX_DIR32:            return R_RX_DIR24S;
1514     case R_RX_DIR24S:           return R_RX_DIR16S;
1515     case R_RX_DIR16S:           return R_RX_DIR8S;
1516     case R_RX_DIR8S:            return R_RX_NONE;
1517
1518     case R_RX_DIR16:            return R_RX_DIR8;
1519     case R_RX_DIR8:             return R_RX_NONE;
1520
1521     case R_RX_DIR16U:           return R_RX_DIR8U;
1522     case R_RX_DIR8U:            return R_RX_NONE;
1523
1524     case R_RX_DIR24S_PCREL:     return R_RX_DIR16S_PCREL;
1525     case R_RX_DIR16S_PCREL:     return R_RX_DIR8S_PCREL;
1526     case R_RX_DIR8S_PCREL:      return R_RX_DIR3U_PCREL;
1527
1528     case R_RX_DIR16UL:          return R_RX_DIR8UL;
1529     case R_RX_DIR8UL:           return R_RX_NONE;
1530     case R_RX_DIR16UW:          return R_RX_DIR8UW;
1531     case R_RX_DIR8UW:           return R_RX_NONE;
1532
1533     case R_RX_RH_32_OP:         return R_RX_RH_24_OP;
1534     case R_RX_RH_24_OP:         return R_RX_RH_16_OP;
1535     case R_RX_RH_16_OP:         return R_RX_DIR8;
1536
1537     case R_RX_ABS32:            return R_RX_ABS24S;
1538     case R_RX_ABS24S:           return R_RX_ABS16S;
1539     case R_RX_ABS16:            return R_RX_ABS8;
1540     case R_RX_ABS16U:           return R_RX_ABS8U;
1541     case R_RX_ABS16S:           return R_RX_ABS8S;
1542     case R_RX_ABS8:             return R_RX_NONE;
1543     case R_RX_ABS8U:            return R_RX_NONE;
1544     case R_RX_ABS8S:            return R_RX_NONE;
1545     case R_RX_ABS24S_PCREL:     return R_RX_ABS16S_PCREL;
1546     case R_RX_ABS16S_PCREL:     return R_RX_ABS8S_PCREL;
1547     case R_RX_ABS8S_PCREL:      return R_RX_NONE;
1548     case R_RX_ABS16UL:          return R_RX_ABS8UL;
1549     case R_RX_ABS16UW:          return R_RX_ABS8UW;
1550     case R_RX_ABS8UL:           return R_RX_NONE;
1551     case R_RX_ABS8UW:           return R_RX_NONE;
1552     }
1553   return r;
1554 };
1555
1556 /* Delete some bytes from a section while relaxing.  */
1557
1558 static bfd_boolean
1559 elf32_rx_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count,
1560                              Elf_Internal_Rela *alignment_rel, int force_snip,
1561                              Elf_Internal_Rela *irelstart)
1562 {
1563   Elf_Internal_Shdr * symtab_hdr;
1564   unsigned int        sec_shndx;
1565   bfd_byte *          contents;
1566   Elf_Internal_Rela * irel;
1567   Elf_Internal_Rela * irelend;
1568   Elf_Internal_Sym *  isym;
1569   Elf_Internal_Sym *  isymend;
1570   bfd_vma             toaddr;
1571   unsigned int        symcount;
1572   struct elf_link_hash_entry ** sym_hashes;
1573   struct elf_link_hash_entry ** end_hashes;
1574
1575   if (!alignment_rel)
1576     force_snip = 1;
1577
1578   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1579
1580   contents = elf_section_data (sec)->this_hdr.contents;
1581
1582   /* The deletion must stop at the next alignment boundary, if
1583      ALIGNMENT_REL is non-NULL.  */
1584   toaddr = sec->size;
1585   if (alignment_rel)
1586     toaddr = alignment_rel->r_offset;
1587
1588   BFD_ASSERT (toaddr > addr);
1589
1590   /* Actually delete the bytes.  */
1591   memmove (contents + addr, contents + addr + count,
1592            (size_t) (toaddr - addr - count));
1593
1594   /* If we don't have an alignment marker to worry about, we can just
1595      shrink the section.  Otherwise, we have to fill in the newly
1596      created gap with NOP insns (0x03).  */
1597   if (force_snip)
1598     sec->size -= count;
1599   else
1600     memset (contents + toaddr - count, 0x03, count);
1601
1602   irel = irelstart;
1603   BFD_ASSERT (irel != NULL || sec->reloc_count == 0);
1604   irelend = irel + sec->reloc_count;
1605
1606   /* Adjust all the relocs.  */
1607   for (; irel < irelend; irel++)
1608     {
1609       /* Get the new reloc address.  */
1610       if (irel->r_offset > addr
1611           && (irel->r_offset < toaddr
1612               || (force_snip && irel->r_offset == toaddr)))
1613         irel->r_offset -= count;
1614
1615       /* If we see an ALIGN marker at the end of the gap, we move it
1616          to the beginning of the gap, since marking these gaps is what
1617          they're for.  */
1618       if (irel->r_offset == toaddr
1619           && ELF32_R_TYPE (irel->r_info) == R_RX_RH_RELAX
1620           && irel->r_addend & RX_RELAXA_ALIGN)
1621         irel->r_offset -= count;
1622     }
1623
1624   /* Adjust the local symbols defined in this section.  */
1625   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1626   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1627   isymend = isym + symtab_hdr->sh_info;
1628
1629   for (; isym < isymend; isym++)
1630     {
1631       /* If the symbol is in the range of memory we just moved, we
1632          have to adjust its value.  */
1633       if (isym->st_shndx == sec_shndx
1634           && isym->st_value > addr
1635           && isym->st_value < toaddr)
1636         isym->st_value -= count;
1637
1638       /* If the symbol *spans* the bytes we just deleted (i.e. it's
1639          *end* is in the moved bytes but it's *start* isn't), then we
1640          must adjust its size.  */
1641       if (isym->st_shndx == sec_shndx
1642           && isym->st_value < addr
1643           && isym->st_value + isym->st_size > addr
1644           && isym->st_value + isym->st_size < toaddr)
1645         isym->st_size -= count;
1646     }
1647
1648   /* Now adjust the global symbols defined in this section.  */
1649   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1650               - symtab_hdr->sh_info);
1651   sym_hashes = elf_sym_hashes (abfd);
1652   end_hashes = sym_hashes + symcount;
1653
1654   for (; sym_hashes < end_hashes; sym_hashes++)
1655     {
1656       struct elf_link_hash_entry *sym_hash = *sym_hashes;
1657
1658       if ((sym_hash->root.type == bfd_link_hash_defined
1659            || sym_hash->root.type == bfd_link_hash_defweak)
1660           && sym_hash->root.u.def.section == sec)
1661         {
1662           /* As above, adjust the value if needed.  */
1663           if (sym_hash->root.u.def.value > addr
1664               && sym_hash->root.u.def.value < toaddr)
1665             sym_hash->root.u.def.value -= count;
1666
1667           /* As above, adjust the size if needed.  */
1668           if (sym_hash->root.u.def.value < addr
1669               && sym_hash->root.u.def.value + sym_hash->size > addr
1670               && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1671             sym_hash->size -= count;
1672         }
1673     }
1674
1675   return TRUE;
1676 }
1677
1678 /* Used to sort relocs by address.  If relocs have the same address,
1679    we maintain their relative order, except that R_RX_RH_RELAX
1680    alignment relocs must be the first reloc for any given address.  */
1681
1682 static void
1683 reloc_bubblesort (Elf_Internal_Rela * r, int count)
1684 {
1685   int i;
1686   bfd_boolean again;
1687   bfd_boolean swappit;
1688
1689   /* This is almost a classic bubblesort.  It's the slowest sort, but
1690      we're taking advantage of the fact that the relocations are
1691      mostly in order already (the assembler emits them that way) and
1692      we need relocs with the same address to remain in the same
1693      relative order.  */
1694   again = TRUE;
1695   while (again)
1696     {
1697       again = FALSE;
1698       for (i = 0; i < count - 1; i ++)
1699         {
1700           if (r[i].r_offset > r[i + 1].r_offset)
1701             swappit = TRUE;
1702           else if (r[i].r_offset < r[i + 1].r_offset)
1703             swappit = FALSE;
1704           else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RX_RH_RELAX
1705                    && (r[i + 1].r_addend & RX_RELAXA_ALIGN))
1706             swappit = TRUE;
1707           else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RX_RH_RELAX
1708                    && (r[i + 1].r_addend & RX_RELAXA_ELIGN)
1709                    && !(ELF32_R_TYPE (r[i].r_info) == R_RX_RH_RELAX
1710                         && (r[i].r_addend & RX_RELAXA_ALIGN)))
1711             swappit = TRUE;
1712           else
1713             swappit = FALSE;
1714
1715           if (swappit)
1716             {
1717               Elf_Internal_Rela tmp;
1718
1719               tmp = r[i];
1720               r[i] = r[i + 1];
1721               r[i + 1] = tmp;
1722               /* If we do move a reloc back, re-scan to see if it
1723                  needs to be moved even further back.  This avoids
1724                  most of the O(n^2) behavior for our cases.  */
1725               if (i > 0)
1726                 i -= 2;
1727               again = TRUE;
1728             }
1729         }
1730     }
1731 }
1732
1733
1734 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
1735   rx_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1736                        lrel, abfd, sec, link_info, scale)
1737
1738 static bfd_vma
1739 rx_offset_for_reloc (bfd *                    abfd,
1740                      Elf_Internal_Rela *      rel,
1741                      Elf_Internal_Shdr *      symtab_hdr,
1742                      Elf_External_Sym_Shndx * shndx_buf ATTRIBUTE_UNUSED,
1743                      Elf_Internal_Sym *       intsyms,
1744                      Elf_Internal_Rela **     lrel,
1745                      bfd *                    input_bfd,
1746                      asection *               input_section,
1747                      struct bfd_link_info *   info,
1748                      int *                    scale)
1749 {
1750   bfd_vma symval;
1751   bfd_reloc_status_type r;
1752
1753   *scale = 1;
1754
1755   /* REL is the first of 1..N relocations.  We compute the symbol
1756      value for each relocation, then combine them if needed.  LREL
1757      gets a pointer to the last relocation used.  */
1758   while (1)
1759     {
1760       int32_t tmp1, tmp2;
1761
1762       /* Get the value of the symbol referred to by the reloc.  */
1763       if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1764         {
1765           /* A local symbol.  */
1766           Elf_Internal_Sym *isym;
1767           asection *ssec;
1768
1769           isym = intsyms + ELF32_R_SYM (rel->r_info);
1770
1771           if (isym->st_shndx == SHN_UNDEF)
1772             ssec = bfd_und_section_ptr;
1773           else if (isym->st_shndx == SHN_ABS)
1774             ssec = bfd_abs_section_ptr;
1775           else if (isym->st_shndx == SHN_COMMON)
1776             ssec = bfd_com_section_ptr;
1777           else
1778             ssec = bfd_section_from_elf_index (abfd,
1779                                                isym->st_shndx);
1780
1781           /* Initial symbol value.  */
1782           symval = isym->st_value;
1783
1784           /* GAS may have made this symbol relative to a section, in
1785              which case, we have to add the addend to find the
1786              symbol.  */
1787           if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
1788             symval += rel->r_addend;
1789
1790           if (ssec)
1791             {
1792               if ((ssec->flags & SEC_MERGE)
1793                   && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
1794                 symval = _bfd_merged_section_offset (abfd, & ssec,
1795                                                      elf_section_data (ssec)->sec_info,
1796                                                      symval);
1797             }
1798
1799           /* Now make the offset relative to where the linker is putting it.  */
1800           if (ssec)
1801             symval +=
1802               ssec->output_section->vma + ssec->output_offset;
1803
1804           symval += rel->r_addend;
1805         }
1806       else
1807         {
1808           unsigned long indx;
1809           struct elf_link_hash_entry * h;
1810
1811           /* An external symbol.  */
1812           indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1813           h = elf_sym_hashes (abfd)[indx];
1814           BFD_ASSERT (h != NULL);
1815
1816           if (h->root.type != bfd_link_hash_defined
1817               && h->root.type != bfd_link_hash_defweak)
1818             {
1819               /* This appears to be a reference to an undefined
1820                  symbol.  Just ignore it--it will be caught by the
1821                  regular reloc processing.  */
1822               if (lrel)
1823                 *lrel = rel;
1824               return 0;
1825             }
1826
1827           symval = (h->root.u.def.value
1828                     + h->root.u.def.section->output_section->vma
1829                     + h->root.u.def.section->output_offset);
1830
1831           symval += rel->r_addend;
1832         }
1833
1834       switch (ELF32_R_TYPE (rel->r_info))
1835         {
1836         case R_RX_SYM:
1837           RX_STACK_PUSH (symval);
1838           break;
1839
1840         case R_RX_OPneg:
1841           RX_STACK_POP (tmp1);
1842           tmp1 = - tmp1;
1843           RX_STACK_PUSH (tmp1);
1844           break;
1845
1846         case R_RX_OPadd:
1847           RX_STACK_POP (tmp1);
1848           RX_STACK_POP (tmp2);
1849           tmp1 += tmp2;
1850           RX_STACK_PUSH (tmp1);
1851           break;
1852
1853         case R_RX_OPsub:
1854           RX_STACK_POP (tmp1);
1855           RX_STACK_POP (tmp2);
1856           tmp2 -= tmp1;
1857           RX_STACK_PUSH (tmp2);
1858           break;
1859
1860         case R_RX_OPmul:
1861           RX_STACK_POP (tmp1);
1862           RX_STACK_POP (tmp2);
1863           tmp1 *= tmp2;
1864           RX_STACK_PUSH (tmp1);
1865           break;
1866
1867         case R_RX_OPdiv:
1868           RX_STACK_POP (tmp1);
1869           RX_STACK_POP (tmp2);
1870           tmp1 /= tmp2;
1871           RX_STACK_PUSH (tmp1);
1872           break;
1873
1874         case R_RX_OPshla:
1875           RX_STACK_POP (tmp1);
1876           RX_STACK_POP (tmp2);
1877           tmp1 <<= tmp2;
1878           RX_STACK_PUSH (tmp1);
1879           break;
1880
1881         case R_RX_OPshra:
1882           RX_STACK_POP (tmp1);
1883           RX_STACK_POP (tmp2);
1884           tmp1 >>= tmp2;
1885           RX_STACK_PUSH (tmp1);
1886           break;
1887
1888         case R_RX_OPsctsize:
1889           RX_STACK_PUSH (input_section->size);
1890           break;
1891
1892         case R_RX_OPscttop:
1893           RX_STACK_PUSH (input_section->output_section->vma);
1894           break;
1895
1896         case R_RX_OPand:
1897           RX_STACK_POP (tmp1);
1898           RX_STACK_POP (tmp2);
1899           tmp1 &= tmp2;
1900           RX_STACK_PUSH (tmp1);
1901           break;
1902
1903         case R_RX_OPor:
1904           RX_STACK_POP (tmp1);
1905           RX_STACK_POP (tmp2);
1906           tmp1 |= tmp2;
1907           RX_STACK_PUSH (tmp1);
1908           break;
1909
1910         case R_RX_OPxor:
1911           RX_STACK_POP (tmp1);
1912           RX_STACK_POP (tmp2);
1913           tmp1 ^= tmp2;
1914           RX_STACK_PUSH (tmp1);
1915           break;
1916
1917         case R_RX_OPnot:
1918           RX_STACK_POP (tmp1);
1919           tmp1 = ~ tmp1;
1920           RX_STACK_PUSH (tmp1);
1921           break;
1922
1923         case R_RX_OPmod:
1924           RX_STACK_POP (tmp1);
1925           RX_STACK_POP (tmp2);
1926           tmp1 %= tmp2;
1927           RX_STACK_PUSH (tmp1);
1928           break;
1929
1930         case R_RX_OPromtop:
1931           RX_STACK_PUSH (get_romstart (info, input_bfd, input_section, rel->r_offset));
1932           break;
1933
1934         case R_RX_OPramtop:
1935           RX_STACK_PUSH (get_ramstart (info, input_bfd, input_section, rel->r_offset));
1936           break;
1937
1938         case R_RX_DIR16UL:
1939         case R_RX_DIR8UL:
1940         case R_RX_ABS16UL:
1941         case R_RX_ABS8UL:
1942           if (rx_stack_top)
1943             RX_STACK_POP (symval);
1944           if (lrel)
1945             *lrel = rel;
1946           *scale = 4;
1947           return symval;
1948
1949         case R_RX_DIR16UW:
1950         case R_RX_DIR8UW:
1951         case R_RX_ABS16UW:
1952         case R_RX_ABS8UW:
1953           if (rx_stack_top)
1954             RX_STACK_POP (symval);
1955           if (lrel)
1956             *lrel = rel;
1957           *scale = 2;
1958           return symval;
1959
1960         default:
1961           if (rx_stack_top)
1962             RX_STACK_POP (symval);
1963           if (lrel)
1964             *lrel = rel;
1965           return symval;
1966         }
1967
1968       rel ++;
1969     }
1970   /* FIXME.  */
1971   (void) r;
1972 }
1973
1974 static void
1975 move_reloc (Elf_Internal_Rela * irel, Elf_Internal_Rela * srel, int delta)
1976 {
1977   bfd_vma old_offset = srel->r_offset;
1978
1979   irel ++;
1980   while (irel <= srel)
1981     {
1982       if (irel->r_offset == old_offset)
1983         irel->r_offset += delta;
1984       irel ++;
1985     }
1986 }
1987
1988 /* Relax one section.  */
1989
1990 static bfd_boolean
1991 elf32_rx_relax_section (bfd *                  abfd,
1992                         asection *             sec,
1993                         struct bfd_link_info * link_info,
1994                         bfd_boolean *          again,
1995                         bfd_boolean            allow_pcrel3)
1996 {
1997   Elf_Internal_Shdr * symtab_hdr;
1998   Elf_Internal_Shdr * shndx_hdr;
1999   Elf_Internal_Rela * internal_relocs;
2000   Elf_Internal_Rela * irel;
2001   Elf_Internal_Rela * srel;
2002   Elf_Internal_Rela * irelend;
2003   Elf_Internal_Rela * next_alignment;
2004   Elf_Internal_Rela * prev_alignment;
2005   bfd_byte *          contents = NULL;
2006   bfd_byte *          free_contents = NULL;
2007   Elf_Internal_Sym *  intsyms = NULL;
2008   Elf_Internal_Sym *  free_intsyms = NULL;
2009   Elf_External_Sym_Shndx * shndx_buf = NULL;
2010   bfd_vma pc;
2011   bfd_vma sec_start;
2012   bfd_vma symval = 0;
2013   int pcrel = 0;
2014   int code = 0;
2015   int section_alignment_glue;
2016   /* how much to scale the relocation by - 1, 2, or 4.  */
2017   int scale;
2018
2019   /* Assume nothing changes.  */
2020   *again = FALSE;
2021
2022   /* We don't have to do anything for a relocatable link, if
2023      this section does not have relocs, or if this is not a
2024      code section.  */
2025   if (bfd_link_relocatable (link_info)
2026       || (sec->flags & SEC_RELOC) == 0
2027       || sec->reloc_count == 0
2028       || (sec->flags & SEC_CODE) == 0)
2029     return TRUE;
2030
2031   symtab_hdr = & elf_symtab_hdr (abfd);
2032   if (elf_symtab_shndx_list (abfd))
2033     shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
2034   else
2035     shndx_hdr = NULL;
2036
2037   sec_start = sec->output_section->vma + sec->output_offset;
2038
2039   /* Get the section contents.  */
2040   if (elf_section_data (sec)->this_hdr.contents != NULL)
2041     contents = elf_section_data (sec)->this_hdr.contents;
2042   /* Go get them off disk.  */
2043   else
2044     {
2045       if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2046         goto error_return;
2047       elf_section_data (sec)->this_hdr.contents = contents;
2048     }
2049
2050   /* Read this BFD's symbols.  */
2051   /* Get cached copy if it exists.  */
2052   if (symtab_hdr->contents != NULL)
2053     intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
2054   else
2055     {
2056       intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
2057       symtab_hdr->contents = (bfd_byte *) intsyms;
2058     }
2059
2060   if (shndx_hdr && shndx_hdr->sh_size != 0)
2061     {
2062       bfd_size_type amt;
2063
2064       amt = symtab_hdr->sh_info;
2065       amt *= sizeof (Elf_External_Sym_Shndx);
2066       shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
2067       if (shndx_buf == NULL)
2068         goto error_return;
2069       if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
2070           || bfd_bread (shndx_buf, amt, abfd) != amt)
2071         goto error_return;
2072       shndx_hdr->contents = (bfd_byte *) shndx_buf;
2073     }
2074
2075   /* Get a copy of the native relocations.  */
2076   /* Note - we ignore the setting of link_info->keep_memory when reading
2077      in these relocs.  We have to maintain a permanent copy of the relocs
2078      because we are going to walk over them multiple times, adjusting them
2079      as bytes are deleted from the section, and with this relaxation
2080      function itself being called multiple times on the same section...  */
2081   internal_relocs = _bfd_elf_link_read_relocs
2082     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL, TRUE);
2083   if (internal_relocs == NULL)
2084     goto error_return;
2085
2086   /* The RL_ relocs must be just before the operand relocs they go
2087      with, so we must sort them to guarantee this.  We use bubblesort
2088      instead of qsort so we can guarantee that relocs with the same
2089      address remain in the same relative order.  */
2090   reloc_bubblesort (internal_relocs, sec->reloc_count);
2091
2092   /* Walk through them looking for relaxing opportunities.  */
2093   irelend = internal_relocs + sec->reloc_count;
2094
2095   /* This will either be NULL or a pointer to the next alignment
2096      relocation.  */
2097   next_alignment = internal_relocs;
2098   /* This will be the previous alignment, although at first it points
2099      to the first real relocation.  */
2100   prev_alignment = internal_relocs;
2101
2102   /* We calculate worst case shrinkage caused by alignment directives.
2103      No fool-proof, but better than either ignoring the problem or
2104      doing heavy duty analysis of all the alignment markers in all
2105      input sections.  */
2106   section_alignment_glue = 0;
2107   for (irel = internal_relocs; irel < irelend; irel++)
2108       if (ELF32_R_TYPE (irel->r_info) == R_RX_RH_RELAX
2109           && irel->r_addend & RX_RELAXA_ALIGN)
2110         {
2111           int this_glue = 1 << (irel->r_addend & RX_RELAXA_ANUM);
2112
2113           if (section_alignment_glue < this_glue)
2114             section_alignment_glue = this_glue;
2115         }
2116   /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
2117      shrinkage.  */
2118   section_alignment_glue *= 2;
2119
2120   for (irel = internal_relocs; irel < irelend; irel++)
2121     {
2122       unsigned char *insn;
2123       int nrelocs;
2124
2125       /* The insns we care about are all marked with one of these.  */
2126       if (ELF32_R_TYPE (irel->r_info) != R_RX_RH_RELAX)
2127         continue;
2128
2129       if (irel->r_addend & RX_RELAXA_ALIGN
2130           || next_alignment == internal_relocs)
2131         {
2132           /* When we delete bytes, we need to maintain all the alignments
2133              indicated.  In addition, we need to be careful about relaxing
2134              jumps across alignment boundaries - these displacements
2135              *grow* when we delete bytes.  For now, don't shrink
2136              displacements across an alignment boundary, just in case.
2137              Note that this only affects relocations to the same
2138              section.  */
2139           prev_alignment = next_alignment;
2140           next_alignment += 2;
2141           while (next_alignment < irelend
2142                  && (ELF32_R_TYPE (next_alignment->r_info) != R_RX_RH_RELAX
2143                      || !(next_alignment->r_addend & RX_RELAXA_ELIGN)))
2144             next_alignment ++;
2145           if (next_alignment >= irelend || next_alignment->r_offset == 0)
2146             next_alignment = NULL;
2147         }
2148
2149       /* When we hit alignment markers, see if we've shrunk enough
2150          before them to reduce the gap without violating the alignment
2151          requirements.  */
2152       if (irel->r_addend & RX_RELAXA_ALIGN)
2153         {
2154           /* At this point, the next relocation *should* be the ELIGN
2155              end marker.  */
2156           Elf_Internal_Rela *erel = irel + 1;
2157           unsigned int alignment, nbytes;
2158
2159           if (ELF32_R_TYPE (erel->r_info) != R_RX_RH_RELAX)
2160             continue;
2161           if (!(erel->r_addend & RX_RELAXA_ELIGN))
2162             continue;
2163
2164           alignment = 1 << (irel->r_addend & RX_RELAXA_ANUM);
2165
2166           if (erel->r_offset - irel->r_offset < alignment)
2167             continue;
2168
2169           nbytes = erel->r_offset - irel->r_offset;
2170           nbytes /= alignment;
2171           nbytes *= alignment;
2172
2173           elf32_rx_relax_delete_bytes (abfd, sec, erel->r_offset-nbytes, nbytes, next_alignment,
2174                                        erel->r_offset == sec->size, internal_relocs);
2175           *again = TRUE;
2176
2177           continue;
2178         }
2179
2180       if (irel->r_addend & RX_RELAXA_ELIGN)
2181           continue;
2182
2183       insn = contents + irel->r_offset;
2184
2185       nrelocs = irel->r_addend & RX_RELAXA_RNUM;
2186
2187       /* At this point, we have an insn that is a candidate for linker
2188          relaxation.  There are NRELOCS relocs following that may be
2189          relaxed, although each reloc may be made of more than one
2190          reloc entry (such as gp-rel symbols).  */
2191
2192       /* Get the value of the symbol referred to by the reloc.  Just
2193          in case this is the last reloc in the list, use the RL's
2194          addend to choose between this reloc (no addend) or the next
2195          (yes addend, which means at least one following reloc).  */
2196
2197       /* srel points to the "current" reloction for this insn -
2198          actually the last reloc for a given operand, which is the one
2199          we need to update.  We check the relaxations in the same
2200          order that the relocations happen, so we'll just push it
2201          along as we go.  */
2202       srel = irel;
2203
2204       pc = sec->output_section->vma + sec->output_offset
2205         + srel->r_offset;
2206
2207 #define GET_RELOC \
2208       symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \
2209       pcrel = symval - pc + srel->r_addend; \
2210       nrelocs --;
2211
2212 #define SNIPNR(offset, nbytes) \
2213       elf32_rx_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0, internal_relocs);
2214 #define SNIP(offset, nbytes, newtype) \
2215         SNIPNR (offset, nbytes);                                                \
2216         srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2217
2218       /* The order of these bit tests must match the order that the
2219          relocs appear in.  Since we sorted those by offset, we can
2220          predict them.  */
2221
2222       /* Note that the numbers in, say, DSP6 are the bit offsets of
2223          the code fields that describe the operand.  Bits number 0 for
2224          the MSB of insn[0].  */
2225
2226       /* DSP* codes:
2227            0  00  [reg]
2228            1  01  dsp:8[reg]
2229            2  10  dsp:16[reg]
2230            3  11  reg  */
2231       if (irel->r_addend & RX_RELAXA_DSP6)
2232         {
2233           GET_RELOC;
2234
2235           code = insn[0] & 3;
2236           if (code == 2 && symval/scale <= 255)
2237             {
2238               unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2239               insn[0] &= 0xfc;
2240               insn[0] |= 0x01;
2241               newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2242               if (newrel != ELF32_R_TYPE (srel->r_info))
2243                 {
2244                   SNIP (3, 1, newrel);
2245                   *again = TRUE;
2246                 }
2247             }
2248
2249           else if (code == 1 && symval == 0)
2250             {
2251               insn[0] &= 0xfc;
2252               SNIP (2, 1, R_RX_NONE);
2253               *again = TRUE;
2254             }
2255
2256           /* Special case DSP:5 format: MOV.bwl dsp:5[Rsrc],Rdst.  */
2257           else if (code == 1 && symval/scale <= 31
2258                    /* Decodable bits.  */
2259                    && (insn[0] & 0xcc) == 0xcc
2260                    /* Width.  */
2261                    && (insn[0] & 0x30) != 0x30
2262                    /* Register MSBs.  */
2263                    && (insn[1] & 0x88)  == 0x00)
2264             {
2265               int newrel = 0;
2266
2267               insn[0] = 0x88 | (insn[0] & 0x30);
2268               /* The register fields are in the right place already.  */
2269
2270               /* We can't relax this new opcode.  */
2271               irel->r_addend = 0;
2272
2273               switch ((insn[0] & 0x30) >> 4)
2274                 {
2275                 case 0:
2276                   newrel = R_RX_RH_ABS5p5B;
2277                   break;
2278                 case 1:
2279                   newrel = R_RX_RH_ABS5p5W;
2280                   break;
2281                 case 2:
2282                   newrel = R_RX_RH_ABS5p5L;
2283                   break;
2284                 }
2285
2286               move_reloc (irel, srel, -2);
2287               SNIP (2, 1, newrel);
2288             }
2289
2290           /* Special case DSP:5 format: MOVU.bw dsp:5[Rsrc],Rdst.  */
2291           else if (code == 1 && symval/scale <= 31
2292                    /* Decodable bits.  */
2293                    && (insn[0] & 0xf8) == 0x58
2294                    /* Register MSBs.  */
2295                    && (insn[1] & 0x88)  == 0x00)
2296             {
2297               int newrel = 0;
2298
2299               insn[0] = 0xb0 | ((insn[0] & 0x04) << 1);
2300               /* The register fields are in the right place already.  */
2301
2302               /* We can't relax this new opcode.  */
2303               irel->r_addend = 0;
2304
2305               switch ((insn[0] & 0x08) >> 3)
2306                 {
2307                 case 0:
2308                   newrel = R_RX_RH_ABS5p5B;
2309                   break;
2310                 case 1:
2311                   newrel = R_RX_RH_ABS5p5W;
2312                   break;
2313                 }
2314
2315               move_reloc (irel, srel, -2);
2316               SNIP (2, 1, newrel);
2317             }
2318         }
2319
2320       /* A DSP4 operand always follows a DSP6 operand, even if there's
2321          no relocation for it.  We have to read the code out of the
2322          opcode to calculate the offset of the operand.  */
2323       if (irel->r_addend & RX_RELAXA_DSP4)
2324         {
2325           int code6, offset = 0;
2326
2327           GET_RELOC;
2328
2329           code6 = insn[0] & 0x03;
2330           switch (code6)
2331             {
2332             case 0: offset = 2; break;
2333             case 1: offset = 3; break;
2334             case 2: offset = 4; break;
2335             case 3: offset = 2; break;
2336             }
2337
2338           code = (insn[0] & 0x0c) >> 2;
2339
2340           if (code == 2 && symval / scale <= 255)
2341             {
2342               unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2343
2344               insn[0] &= 0xf3;
2345               insn[0] |= 0x04;
2346               newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2347               if (newrel != ELF32_R_TYPE (srel->r_info))
2348                 {
2349                   SNIP (offset+1, 1, newrel);
2350                   *again = TRUE;
2351                 }
2352             }
2353
2354           else if (code == 1 && symval == 0)
2355             {
2356               insn[0] &= 0xf3;
2357               SNIP (offset, 1, R_RX_NONE);
2358               *again = TRUE;
2359             }
2360           /* Special case DSP:5 format: MOV.bwl Rsrc,dsp:5[Rdst] */
2361           else if (code == 1 && symval/scale <= 31
2362                    /* Decodable bits.  */
2363                    && (insn[0] & 0xc3) == 0xc3
2364                    /* Width.  */
2365                    && (insn[0] & 0x30) != 0x30
2366                    /* Register MSBs.  */
2367                    && (insn[1] & 0x88)  == 0x00)
2368             {
2369               int newrel = 0;
2370
2371               insn[0] = 0x80 | (insn[0] & 0x30);
2372               /* The register fields are in the right place already.  */
2373
2374               /* We can't relax this new opcode.  */
2375               irel->r_addend = 0;
2376
2377               switch ((insn[0] & 0x30) >> 4)
2378                 {
2379                 case 0:
2380                   newrel = R_RX_RH_ABS5p5B;
2381                   break;
2382                 case 1:
2383                   newrel = R_RX_RH_ABS5p5W;
2384                   break;
2385                 case 2:
2386                   newrel = R_RX_RH_ABS5p5L;
2387                   break;
2388                 }
2389
2390               move_reloc (irel, srel, -2);
2391               SNIP (2, 1, newrel);
2392             }
2393         }
2394
2395       /* These always occur alone, but the offset depends on whether
2396          it's a MEMEX opcode (0x06) or not.  */
2397       if (irel->r_addend & RX_RELAXA_DSP14)
2398         {
2399           int offset;
2400           GET_RELOC;
2401
2402           if (insn[0] == 0x06)
2403             offset = 3;
2404           else
2405             offset = 4;
2406
2407           code = insn[1] & 3;
2408
2409           if (code == 2 && symval / scale <= 255)
2410             {
2411               unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2412
2413               insn[1] &= 0xfc;
2414               insn[1] |= 0x01;
2415               newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2416               if (newrel != ELF32_R_TYPE (srel->r_info))
2417                 {
2418                   SNIP (offset, 1, newrel);
2419                   *again = TRUE;
2420                 }
2421             }
2422           else if (code == 1 && symval == 0)
2423             {
2424               insn[1] &= 0xfc;
2425               SNIP (offset, 1, R_RX_NONE);
2426               *again = TRUE;
2427             }
2428         }
2429
2430       /* IMM* codes:
2431            0  00  imm:32
2432            1  01  simm:8
2433            2  10  simm:16
2434            3  11  simm:24.  */
2435
2436       /* These always occur alone.  */
2437       if (irel->r_addend & RX_RELAXA_IMM6)
2438         {
2439           long ssymval;
2440
2441           GET_RELOC;
2442
2443           /* These relocations sign-extend, so we must do signed compares.  */
2444           ssymval = (long) symval;
2445
2446           code = insn[0] & 0x03;
2447
2448           if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608)
2449             {
2450               unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2451
2452               insn[0] &= 0xfc;
2453               insn[0] |= 0x03;
2454               newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2455               if (newrel != ELF32_R_TYPE (srel->r_info))
2456                 {
2457                   SNIP (2, 1, newrel);
2458                   *again = TRUE;
2459                 }
2460             }
2461
2462           else if (code == 3 && ssymval <= 32767 && ssymval >= -32768)
2463             {
2464               unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2465
2466               insn[0] &= 0xfc;
2467               insn[0] |= 0x02;
2468               newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2469               if (newrel != ELF32_R_TYPE (srel->r_info))
2470                 {
2471                   SNIP (2, 1, newrel);
2472                   *again = TRUE;
2473                 }
2474             }
2475
2476           /* Special case UIMM8 format: CMP #uimm8,Rdst.  */
2477           else if (code == 2 && ssymval <= 255 && ssymval >= 16
2478                    /* Decodable bits.  */
2479                    && (insn[0] & 0xfc) == 0x74
2480                    /* Decodable bits.  */
2481                    && ((insn[1] & 0xf0) == 0x00))
2482             {
2483               int newrel;
2484
2485               insn[0] = 0x75;
2486               insn[1] = 0x50 | (insn[1] & 0x0f);
2487
2488               /* We can't relax this new opcode.  */
2489               irel->r_addend = 0;
2490
2491               if (STACK_REL_P (ELF32_R_TYPE (srel->r_info)))
2492                 newrel = R_RX_ABS8U;
2493               else
2494                 newrel = R_RX_DIR8U;
2495
2496               SNIP (2, 1, newrel);
2497               *again = TRUE;
2498             }
2499
2500           else if (code == 2 && ssymval <= 127 && ssymval >= -128)
2501             {
2502               unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2503
2504               insn[0] &= 0xfc;
2505               insn[0] |= 0x01;
2506               newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2507               if (newrel != ELF32_R_TYPE (srel->r_info))
2508                 {
2509                   SNIP (2, 1, newrel);
2510                   *again = TRUE;
2511                 }
2512             }
2513
2514           /* Special case UIMM4 format: CMP, MUL, AND, OR.  */
2515           else if (code == 1 && ssymval <= 15 && ssymval >= 0
2516                    /* Decodable bits and immediate type.  */
2517                    && insn[0] == 0x75
2518                    /* Decodable bits.  */
2519                    && (insn[1] & 0xc0)  == 0x00)
2520             {
2521               static const int newop[4] = { 1, 3, 4, 5 };
2522
2523               insn[0] = 0x60 | newop[insn[1] >> 4];
2524               /* The register number doesn't move.  */
2525
2526               /* We can't relax this new opcode.  */
2527               irel->r_addend = 0;
2528
2529               move_reloc (irel, srel, -1);
2530
2531               SNIP (2, 1, R_RX_RH_UIMM4p8);
2532               *again = TRUE;
2533             }
2534
2535           /* Special case UIMM4 format: ADD -> ADD/SUB.  */
2536           else if (code == 1 && ssymval <= 15 && ssymval >= -15
2537                    /* Decodable bits and immediate type.  */
2538                    && insn[0] == 0x71
2539                    /* Same register for source and destination.  */
2540                    && ((insn[1] >> 4) == (insn[1] & 0x0f)))
2541             {
2542               int newrel;
2543
2544               /* Note that we can't turn "add $0,Rs" into a NOP
2545                  because the flags need to be set right.  */
2546
2547               if (ssymval < 0)
2548                 {
2549                   insn[0] = 0x60; /* Subtract.  */
2550                   newrel = R_RX_RH_UNEG4p8;
2551                 }
2552               else
2553                 {
2554                   insn[0] = 0x62; /* Add.  */
2555                   newrel = R_RX_RH_UIMM4p8;
2556                 }
2557
2558               /* The register number is in the right place.  */
2559
2560               /* We can't relax this new opcode.  */
2561               irel->r_addend = 0;
2562
2563               move_reloc (irel, srel, -1);
2564
2565               SNIP (2, 1, newrel);
2566               *again = TRUE;
2567             }
2568         }
2569
2570       /* These are either matched with a DSP6 (2-byte base) or an id24
2571          (3-byte base).  */
2572       if (irel->r_addend & RX_RELAXA_IMM12)
2573         {
2574           int dspcode, offset = 0;
2575           long ssymval;
2576
2577           GET_RELOC;
2578
2579           if ((insn[0] & 0xfc) == 0xfc)
2580             dspcode = 1; /* Just something with one byte operand.  */
2581           else
2582             dspcode = insn[0] & 3;
2583           switch (dspcode)
2584             {
2585             case 0: offset = 2; break;
2586             case 1: offset = 3; break;
2587             case 2: offset = 4; break;
2588             case 3: offset = 2; break;
2589             }
2590
2591           /* These relocations sign-extend, so we must do signed compares.  */
2592           ssymval = (long) symval;
2593
2594           code = (insn[1] >> 2) & 3;
2595           if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608)
2596             {
2597               unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2598
2599               insn[1] &= 0xf3;
2600               insn[1] |= 0x0c;
2601               newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2602               if (newrel != ELF32_R_TYPE (srel->r_info))
2603                 {
2604                   SNIP (offset, 1, newrel);
2605                   *again = TRUE;
2606                 }
2607             }
2608
2609           else if (code == 3 && ssymval <= 32767 && ssymval >= -32768)
2610             {
2611               unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2612
2613               insn[1] &= 0xf3;
2614               insn[1] |= 0x08;
2615               newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2616               if (newrel != ELF32_R_TYPE (srel->r_info))
2617                 {
2618                   SNIP (offset, 1, newrel);
2619                   *again = TRUE;
2620                 }
2621             }
2622
2623           /* Special case UIMM8 format: MOV #uimm8,Rdst.  */
2624           else if (code == 2 && ssymval <= 255 && ssymval >= 16
2625                    /* Decodable bits.  */
2626                    && insn[0] == 0xfb
2627                    /* Decodable bits.  */
2628                    && ((insn[1] & 0x03) == 0x02))
2629             {
2630               int newrel;
2631
2632               insn[0] = 0x75;
2633               insn[1] = 0x40 | (insn[1] >> 4);
2634
2635               /* We can't relax this new opcode.  */
2636               irel->r_addend = 0;
2637
2638               if (STACK_REL_P (ELF32_R_TYPE (srel->r_info)))
2639                 newrel = R_RX_ABS8U;
2640               else
2641                 newrel = R_RX_DIR8U;
2642
2643               SNIP (2, 1, newrel);
2644               *again = TRUE;
2645             }
2646
2647           else if (code == 2 && ssymval <= 127 && ssymval >= -128)
2648             {
2649               unsigned int newrel = ELF32_R_TYPE(srel->r_info);
2650
2651               insn[1] &= 0xf3;
2652               insn[1] |= 0x04;
2653               newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2654               if (newrel != ELF32_R_TYPE(srel->r_info))
2655                 {
2656                   SNIP (offset, 1, newrel);
2657                   *again = TRUE;
2658                 }
2659             }
2660
2661           /* Special case UIMM4 format: MOV #uimm4,Rdst.  */
2662           else if (code == 1 && ssymval <= 15 && ssymval >= 0
2663                    /* Decodable bits.  */
2664                    && insn[0] == 0xfb
2665                    /* Decodable bits.  */
2666                    && ((insn[1] & 0x03) == 0x02))
2667             {
2668               insn[0] = 0x66;
2669               insn[1] = insn[1] >> 4;
2670
2671               /* We can't relax this new opcode.  */
2672               irel->r_addend = 0;
2673
2674               move_reloc (irel, srel, -1);
2675
2676               SNIP (2, 1, R_RX_RH_UIMM4p8);
2677               *again = TRUE;
2678             }
2679         }
2680
2681       if (irel->r_addend & RX_RELAXA_BRA)
2682         {
2683           unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2684           int max_pcrel3 = 4;
2685           int alignment_glue = 0;
2686
2687           GET_RELOC;
2688
2689           /* Branches over alignment chunks are problematic, as
2690              deleting bytes here makes the branch *further* away.  We
2691              can be agressive with branches within this alignment
2692              block, but not branches outside it.  */
2693           if ((prev_alignment == NULL
2694                || symval < (bfd_vma)(sec_start + prev_alignment->r_offset))
2695               && (next_alignment == NULL
2696                   || symval > (bfd_vma)(sec_start + next_alignment->r_offset)))
2697             alignment_glue = section_alignment_glue;
2698
2699           if (ELF32_R_TYPE(srel[1].r_info) == R_RX_RH_RELAX
2700               && srel[1].r_addend & RX_RELAXA_BRA
2701               && srel[1].r_offset < irel->r_offset + pcrel)
2702             max_pcrel3 ++;
2703
2704           newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2705
2706           /* The values we compare PCREL with are not what you'd
2707              expect; they're off by a little to compensate for (1)
2708              where the reloc is relative to the insn, and (2) how much
2709              the insn is going to change when we relax it.  */
2710
2711           /* These we have to decode.  */
2712           switch (insn[0])
2713             {
2714             case 0x04: /* BRA pcdsp:24 */
2715               if (-32768 + alignment_glue <= pcrel
2716                   && pcrel <= 32765 - alignment_glue)
2717                 {
2718                   insn[0] = 0x38;
2719                   SNIP (3, 1, newrel);
2720                   *again = TRUE;
2721                 }
2722               break;
2723
2724             case 0x38: /* BRA pcdsp:16 */
2725               if (-128 + alignment_glue <= pcrel
2726                   && pcrel <= 127 - alignment_glue)
2727                 {
2728                   insn[0] = 0x2e;
2729                   SNIP (2, 1, newrel);
2730                   *again = TRUE;
2731                 }
2732               break;
2733
2734             case 0x2e: /* BRA pcdsp:8 */
2735               /* Note that there's a risk here of shortening things so
2736                  much that we no longer fit this reloc; it *should*
2737                  only happen when you branch across a branch, and that
2738                  branch also devolves into BRA.S.  "Real" code should
2739                  be OK.  */
2740               if (max_pcrel3 + alignment_glue <= pcrel
2741                   && pcrel <= 10 - alignment_glue
2742                   && allow_pcrel3)
2743                 {
2744                   insn[0] = 0x08;
2745                   SNIP (1, 1, newrel);
2746                   move_reloc (irel, srel, -1);
2747                   *again = TRUE;
2748                 }
2749               break;
2750
2751             case 0x05: /* BSR pcdsp:24 */
2752               if (-32768 + alignment_glue <= pcrel
2753                   && pcrel <= 32765 - alignment_glue)
2754                 {
2755                   insn[0] = 0x39;
2756                   SNIP (1, 1, newrel);
2757                   *again = TRUE;
2758                 }
2759               break;
2760
2761             case 0x3a: /* BEQ.W pcdsp:16 */
2762             case 0x3b: /* BNE.W pcdsp:16 */
2763               if (-128 + alignment_glue <= pcrel
2764                   && pcrel <= 127 - alignment_glue)
2765                 {
2766                   insn[0] = 0x20 | (insn[0] & 1);
2767                   SNIP (1, 1, newrel);
2768                   *again = TRUE;
2769                 }
2770               break;
2771
2772             case 0x20: /* BEQ.B pcdsp:8 */
2773             case 0x21: /* BNE.B pcdsp:8 */
2774               if (max_pcrel3 + alignment_glue <= pcrel
2775                   && pcrel - alignment_glue <= 10
2776                   && allow_pcrel3)
2777                 {
2778                   insn[0] = 0x10 | ((insn[0] & 1) << 3);
2779                   SNIP (1, 1, newrel);
2780                   move_reloc (irel, srel, -1);
2781                   *again = TRUE;
2782                 }
2783               break;
2784
2785             case 0x16: /* synthetic BNE dsp24 */
2786             case 0x1e: /* synthetic BEQ dsp24 */
2787               if (-32767 + alignment_glue <= pcrel
2788                   && pcrel <= 32766 - alignment_glue
2789                   && insn[1] == 0x04)
2790                 {
2791                   if (insn[0] == 0x16)
2792                     insn[0] = 0x3b;
2793                   else
2794                     insn[0] = 0x3a;
2795                   /* We snip out the bytes at the end else the reloc
2796                      will get moved too, and too much.  */
2797                   SNIP (3, 2, newrel);
2798                   move_reloc (irel, srel, -1);
2799                   *again = TRUE;
2800                 }
2801               break;
2802             }
2803
2804           /* Special case - synthetic conditional branches, pcrel24.
2805              Note that EQ and NE have been handled above.  */
2806           if ((insn[0] & 0xf0) == 0x20
2807               && insn[1] == 0x06
2808               && insn[2] == 0x04
2809               && srel->r_offset != irel->r_offset + 1
2810               && -32767 + alignment_glue <= pcrel
2811               && pcrel <= 32766 - alignment_glue)
2812             {
2813               insn[1] = 0x05;
2814               insn[2] = 0x38;
2815               SNIP (5, 1, newrel);
2816               *again = TRUE;
2817             }
2818
2819           /* Special case - synthetic conditional branches, pcrel16 */
2820           if ((insn[0] & 0xf0) == 0x20
2821               && insn[1] == 0x05
2822               && insn[2] == 0x38
2823               && srel->r_offset != irel->r_offset + 1
2824               && -127 + alignment_glue <= pcrel
2825               && pcrel <= 126 - alignment_glue)
2826             {
2827               int cond = (insn[0] & 0x0f) ^ 0x01;
2828
2829               insn[0] = 0x20 | cond;
2830               /* By moving the reloc first, we avoid having
2831                  delete_bytes move it also.  */
2832               move_reloc (irel, srel, -2);
2833               SNIP (2, 3, newrel);
2834               *again = TRUE;
2835             }
2836         }
2837
2838       BFD_ASSERT (nrelocs == 0);
2839
2840       /* Special case - check MOV.bwl #IMM, dsp[reg] and see if we can
2841          use MOV.bwl #uimm:8, dsp:5[r7] format.  This is tricky
2842          because it may have one or two relocations.  */
2843       if ((insn[0] & 0xfc) == 0xf8
2844           && (insn[1] & 0x80) == 0x00
2845           && (insn[0] & 0x03) != 0x03)
2846         {
2847           int dcode, icode, reg, ioff, dscale, ilen;
2848           bfd_vma disp_val = 0;
2849           long imm_val = 0;
2850           Elf_Internal_Rela * disp_rel = 0;
2851           Elf_Internal_Rela * imm_rel = 0;
2852
2853           /* Reset this.  */
2854           srel = irel;
2855
2856           dcode = insn[0] & 0x03;
2857           icode = (insn[1] >> 2) & 0x03;
2858           reg = (insn[1] >> 4) & 0x0f;
2859
2860           ioff = dcode == 1 ? 3 : dcode == 2 ? 4 : 2;
2861
2862           /* Figure out what the dispacement is.  */
2863           if (dcode == 1 || dcode == 2)
2864             {
2865               /* There's a displacement.  See if there's a reloc for it.  */
2866               if (srel[1].r_offset == irel->r_offset + 2)
2867                 {
2868                   GET_RELOC;
2869                   disp_val = symval;
2870                   disp_rel = srel;
2871                 }
2872               else
2873                 {
2874                   if (dcode == 1)
2875                     disp_val = insn[2];
2876                   else
2877                     {
2878 #if RX_OPCODE_BIG_ENDIAN
2879                       disp_val = insn[2] * 256 + insn[3];
2880 #else
2881                       disp_val = insn[2] + insn[3] * 256;
2882 #endif
2883                     }
2884                   switch (insn[1] & 3)
2885                     {
2886                     case 1:
2887                       disp_val *= 2;
2888                       scale = 2;
2889                       break;
2890                     case 2:
2891                       disp_val *= 4;
2892                       scale = 4;
2893                       break;
2894                     }
2895                 }
2896             }
2897
2898           dscale = scale;
2899
2900           /* Figure out what the immediate is.  */
2901           if (srel[1].r_offset == irel->r_offset + ioff)
2902             {
2903               GET_RELOC;
2904               imm_val = (long) symval;
2905               imm_rel = srel;
2906             }
2907           else
2908             {
2909               unsigned char * ip = insn + ioff;
2910
2911               switch (icode)
2912                 {
2913                 case 1:
2914                   /* For byte writes, we don't sign extend.  Makes the math easier later.  */
2915                   if (scale == 1)
2916                     imm_val = ip[0];
2917                   else
2918                     imm_val = (char) ip[0];
2919                   break;
2920                 case 2:
2921 #if RX_OPCODE_BIG_ENDIAN
2922                   imm_val = ((char) ip[0] << 8) | ip[1];
2923 #else
2924                   imm_val = ((char) ip[1] << 8) | ip[0];
2925 #endif
2926                   break;
2927                 case 3:
2928 #if RX_OPCODE_BIG_ENDIAN
2929                   imm_val = ((char) ip[0] << 16) | (ip[1] << 8) | ip[2];
2930 #else
2931                   imm_val = ((char) ip[2] << 16) | (ip[1] << 8) | ip[0];
2932 #endif
2933                   break;
2934                 case 0:
2935 #if RX_OPCODE_BIG_ENDIAN
2936                   imm_val = (ip[0] << 24) | (ip[1] << 16) | (ip[2] << 8) | ip[3];
2937 #else
2938                   imm_val = (ip[3] << 24) | (ip[2] << 16) | (ip[1] << 8) | ip[0];
2939 #endif
2940                   break;
2941                 }
2942             }
2943
2944           ilen = 2;
2945
2946           switch (dcode)
2947             {
2948             case 1:
2949               ilen += 1;
2950               break;
2951             case 2:
2952               ilen += 2;
2953               break;
2954             }
2955
2956           switch (icode)
2957             {
2958             case 1:
2959               ilen += 1;
2960               break;
2961             case 2:
2962               ilen += 2;
2963               break;
2964             case 3:
2965               ilen += 3;
2966               break;
2967             case 4:
2968               ilen += 4;
2969               break;
2970             }
2971
2972           /* The shortcut happens when the immediate is 0..255,
2973              register r0 to r7, and displacement (scaled) 0..31.  */
2974
2975           if (0 <= imm_val && imm_val <= 255
2976               && 0 <= reg && reg <= 7
2977               && disp_val / dscale <= 31)
2978             {
2979               insn[0] = 0x3c | (insn[1] & 0x03);
2980               insn[1] = (((disp_val / dscale) << 3) & 0x80) | (reg << 4) | ((disp_val/dscale) & 0x0f);
2981               insn[2] = imm_val;
2982
2983               if (disp_rel)
2984                 {
2985                   int newrel = R_RX_NONE;
2986
2987                   switch (dscale)
2988                     {
2989                     case 1:
2990                       newrel = R_RX_RH_ABS5p8B;
2991                       break;
2992                     case 2:
2993                       newrel = R_RX_RH_ABS5p8W;
2994                       break;
2995                     case 4:
2996                       newrel = R_RX_RH_ABS5p8L;
2997                       break;
2998                     }
2999                   disp_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (disp_rel->r_info), newrel);
3000                   move_reloc (irel, disp_rel, -1);
3001                 }
3002               if (imm_rel)
3003                 {
3004                   imm_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (imm_rel->r_info), R_RX_DIR8U);
3005                   move_reloc (disp_rel ? disp_rel : irel,
3006                               imm_rel,
3007                               irel->r_offset - imm_rel->r_offset + 2);
3008                 }
3009
3010               SNIPNR (3, ilen - 3);
3011               *again = TRUE;
3012
3013               /* We can't relax this new opcode.  */
3014               irel->r_addend = 0;
3015             }
3016         }
3017     }
3018
3019   /* We can't reliably relax branches to DIR3U_PCREL unless we know
3020      whatever they're branching over won't shrink any more.  If we're
3021      basically done here, do one more pass just for branches - but
3022      don't request a pass after that one!  */
3023   if (!*again && !allow_pcrel3)
3024     {
3025       bfd_boolean ignored;
3026
3027       elf32_rx_relax_section (abfd, sec, link_info, &ignored, TRUE);
3028     }
3029
3030   return TRUE;
3031
3032  error_return:
3033   if (free_contents != NULL)
3034     free (free_contents);
3035
3036   if (shndx_buf != NULL)
3037     {
3038       shndx_hdr->contents = NULL;
3039       free (shndx_buf);
3040     }
3041
3042   if (free_intsyms != NULL)
3043     free (free_intsyms);
3044
3045   return FALSE;
3046 }
3047
3048 static bfd_boolean
3049 elf32_rx_relax_section_wrapper (bfd *                  abfd,
3050                                 asection *             sec,
3051                                 struct bfd_link_info * link_info,
3052                                 bfd_boolean *          again)
3053 {
3054   return elf32_rx_relax_section (abfd, sec, link_info, again, FALSE);
3055 }
3056 \f
3057 /* Function to set the ELF flag bits.  */
3058
3059 static bfd_boolean
3060 rx_elf_set_private_flags (bfd * abfd, flagword flags)
3061 {
3062   elf_elfheader (abfd)->e_flags = flags;
3063   elf_flags_init (abfd) = TRUE;
3064   return TRUE;
3065 }
3066
3067 static bfd_boolean no_warn_mismatch = FALSE;
3068 static bfd_boolean ignore_lma = TRUE;
3069
3070 void bfd_elf32_rx_set_target_flags (bfd_boolean, bfd_boolean);
3071
3072 void
3073 bfd_elf32_rx_set_target_flags (bfd_boolean user_no_warn_mismatch,
3074                                bfd_boolean user_ignore_lma)
3075 {
3076   no_warn_mismatch = user_no_warn_mismatch;
3077   ignore_lma = user_ignore_lma;
3078 }
3079
3080 /* Converts FLAGS into a descriptive string.
3081    Returns a static pointer.  */
3082
3083 static const char *
3084 describe_flags (flagword flags)
3085 {
3086   static char buf [128];
3087
3088   buf[0] = 0;
3089
3090   if (flags & E_FLAG_RX_64BIT_DOUBLES)
3091     strcat (buf, "64-bit doubles");
3092   else
3093     strcat (buf, "32-bit doubles");
3094
3095   if (flags & E_FLAG_RX_DSP)
3096     strcat (buf, ", dsp");
3097   else
3098     strcat (buf, ", no dsp");
3099
3100   if (flags & E_FLAG_RX_PID)
3101     strcat (buf, ", pid");
3102   else
3103     strcat (buf, ", no pid");
3104
3105   if (flags & E_FLAG_RX_ABI)
3106     strcat (buf, ", RX ABI");
3107   else
3108     strcat (buf, ", GCC ABI");
3109
3110   if (flags & E_FLAG_RX_SINSNS_SET)
3111     strcat (buf, flags & E_FLAG_RX_SINSNS_YES ? ", uses String instructions" : ", bans String instructions");
3112
3113   return buf;
3114 }
3115
3116 /* Merge backend specific data from an object file to the output
3117    object file when linking.  */
3118
3119 static bfd_boolean
3120 rx_elf_merge_private_bfd_data (bfd * ibfd, struct bfd_link_info *info)
3121 {
3122   bfd *obfd = info->output_bfd;
3123   flagword old_flags;
3124   flagword new_flags;
3125   bfd_boolean error = FALSE;
3126
3127   new_flags = elf_elfheader (ibfd)->e_flags;
3128   old_flags = elf_elfheader (obfd)->e_flags;
3129
3130   if (!elf_flags_init (obfd))
3131     {
3132       /* First call, no flags set.  */
3133       elf_flags_init (obfd) = TRUE;
3134       elf_elfheader (obfd)->e_flags = new_flags;
3135     }
3136   else if (old_flags != new_flags)
3137     {
3138       flagword known_flags;
3139
3140       if (old_flags & E_FLAG_RX_SINSNS_SET)
3141         {
3142           if ((new_flags & E_FLAG_RX_SINSNS_SET) == 0)
3143             {
3144               new_flags &= ~ E_FLAG_RX_SINSNS_MASK;
3145               new_flags |= (old_flags & E_FLAG_RX_SINSNS_MASK);
3146             }
3147         }
3148       else if (new_flags & E_FLAG_RX_SINSNS_SET)
3149         {
3150           old_flags &= ~ E_FLAG_RX_SINSNS_MASK;
3151           old_flags |= (new_flags & E_FLAG_RX_SINSNS_MASK);
3152         }
3153
3154       known_flags = E_FLAG_RX_ABI | E_FLAG_RX_64BIT_DOUBLES
3155         | E_FLAG_RX_DSP | E_FLAG_RX_PID | E_FLAG_RX_SINSNS_MASK;
3156
3157       if ((old_flags ^ new_flags) & known_flags)
3158         {
3159           /* Only complain if flag bits we care about do not match.
3160              Other bits may be set, since older binaries did use some
3161              deprecated flags.  */
3162           if (no_warn_mismatch)
3163             {
3164               elf_elfheader (obfd)->e_flags = (new_flags | old_flags) & known_flags;
3165             }
3166           else
3167             {
3168               _bfd_error_handler (_("there is a conflict merging the"
3169                                     " ELF header flags from %pB"),
3170                                   ibfd);
3171               _bfd_error_handler (_("  the input  file's flags: %s"),
3172                                   describe_flags (new_flags));
3173               _bfd_error_handler (_("  the output file's flags: %s"),
3174                                   describe_flags (old_flags));
3175               error = TRUE;
3176             }
3177         }
3178       else
3179         elf_elfheader (obfd)->e_flags = new_flags & known_flags;
3180     }
3181
3182   if (error)
3183     bfd_set_error (bfd_error_bad_value);
3184
3185   return !error;
3186 }
3187 \f
3188 static bfd_boolean
3189 rx_elf_print_private_bfd_data (bfd * abfd, void * ptr)
3190 {
3191   FILE * file = (FILE *) ptr;
3192   flagword flags;
3193
3194   BFD_ASSERT (abfd != NULL && ptr != NULL);
3195
3196   /* Print normal ELF private data.  */
3197   _bfd_elf_print_private_bfd_data (abfd, ptr);
3198
3199   flags = elf_elfheader (abfd)->e_flags;
3200   fprintf (file, _("private flags = 0x%lx:"), (long) flags);
3201
3202   fprintf (file, "%s", describe_flags (flags));
3203   return TRUE;
3204 }
3205
3206 /* Return the MACH for an e_flags value.  */
3207
3208 static int
3209 elf32_rx_machine (bfd * abfd ATTRIBUTE_UNUSED)
3210 {
3211 #if 0 /* FIXME: EF_RX_CPU_MASK collides with E_FLAG_RX_...
3212          Need to sort out how these flag bits are used.
3213          For now we assume that the flags are OK.  */
3214   if ((elf_elfheader (abfd)->e_flags & EF_RX_CPU_MASK) == EF_RX_CPU_RX)
3215 #endif
3216     return bfd_mach_rx;
3217
3218   return 0;
3219 }
3220
3221 static bfd_boolean
3222 rx_elf_object_p (bfd * abfd)
3223 {
3224   int i;
3225   unsigned int u;
3226   Elf_Internal_Phdr *phdr = elf_tdata (abfd)->phdr;
3227   Elf_Internal_Ehdr *ehdr = elf_elfheader (abfd);
3228   int nphdrs = ehdr->e_phnum;
3229   sec_ptr bsec;
3230   static int saw_be = FALSE;
3231   bfd_vma end_phdroff;
3232
3233   /* We never want to automatically choose the non-swapping big-endian
3234      target.  The user can only get that explicitly, such as with -I
3235      and objcopy.  */
3236   if (abfd->xvec == &rx_elf32_be_ns_vec
3237       && abfd->target_defaulted)
3238     return FALSE;
3239
3240   /* BFD->target_defaulted is not set to TRUE when a target is chosen
3241      as a fallback, so we check for "scanning" to know when to stop
3242      using the non-swapping target.  */
3243   if (abfd->xvec == &rx_elf32_be_ns_vec
3244       && saw_be)
3245     return FALSE;
3246   if (abfd->xvec == &rx_elf32_be_vec)
3247     saw_be = TRUE;
3248
3249   bfd_default_set_arch_mach (abfd, bfd_arch_rx,
3250                              elf32_rx_machine (abfd));
3251
3252   /* For each PHDR in the object, we must find some section that
3253      corresponds (based on matching file offsets) and use its VMA
3254      information to reconstruct the p_vaddr field we clobbered when we
3255      wrote it out.  */
3256   /* If PT_LOAD headers include the ELF file header or program headers
3257      then the PT_LOAD header does not start with some section contents.
3258      Making adjustments based on the difference between sh_offset and
3259      p_offset is nonsense in such cases.  Exclude them.  Note that
3260      since standard linker scripts for RX do not use SIZEOF_HEADERS,
3261      the linker won't normally create PT_LOAD segments covering the
3262      headers so this is mainly for passing the ld testsuite.
3263      FIXME.  Why are we looking at non-PT_LOAD headers here?  */
3264   end_phdroff = ehdr->e_ehsize;
3265   if (ehdr->e_phoff != 0)
3266     end_phdroff = ehdr->e_phoff + nphdrs * ehdr->e_phentsize;
3267   for (i=0; i<nphdrs; i++)
3268     {
3269       for (u=0; u<elf_tdata(abfd)->num_elf_sections; u++)
3270         {
3271           Elf_Internal_Shdr *sec = elf_tdata(abfd)->elf_sect_ptr[u];
3272
3273           if (phdr[i].p_filesz
3274               && phdr[i].p_offset >= end_phdroff
3275               && phdr[i].p_offset <= (bfd_vma) sec->sh_offset
3276               && sec->sh_size > 0
3277               && sec->sh_type != SHT_NOBITS
3278               && (bfd_vma)sec->sh_offset <= phdr[i].p_offset + (phdr[i].p_filesz - 1))
3279             {
3280               /* Found one!  The difference between the two addresses,
3281                  plus the difference between the two file offsets, is
3282                  enough information to reconstruct the lma.  */
3283
3284               /* Example where they aren't:
3285                  PHDR[1] = lma fffc0100 offset 00002010 size 00000100
3286                  SEC[6]  = vma 00000050 offset 00002050 size 00000040
3287
3288                  The correct LMA for the section is fffc0140 + (2050-2010).
3289               */
3290
3291               phdr[i].p_vaddr = sec->sh_addr + (sec->sh_offset - phdr[i].p_offset);
3292               break;
3293             }
3294         }
3295
3296       /* We must update the bfd sections as well, so we don't stop
3297          with one match.  */
3298       bsec = abfd->sections;
3299       while (bsec)
3300         {
3301           if (phdr[i].p_filesz
3302               && phdr[i].p_vaddr <= bsec->vma
3303               && bsec->vma <= phdr[i].p_vaddr + (phdr[i].p_filesz - 1))
3304             {
3305               bsec->lma = phdr[i].p_paddr + (bsec->vma - phdr[i].p_vaddr);
3306             }
3307           bsec = bsec->next;
3308         }
3309     }
3310
3311   return TRUE;
3312 }
3313
3314 static bfd_boolean
3315 rx_linux_object_p (bfd * abfd)
3316 {
3317   bfd_default_set_arch_mach (abfd, bfd_arch_rx,
3318            elf32_rx_machine (abfd));
3319   return TRUE;
3320 }
3321  \f
3322
3323 #ifdef DEBUG
3324 void
3325 rx_dump_symtab (bfd * abfd, void * internal_syms, void * external_syms)
3326 {
3327   size_t locsymcount;
3328   Elf_Internal_Sym * isymbuf;
3329   Elf_Internal_Sym * isymend;
3330   Elf_Internal_Sym * isym;
3331   Elf_Internal_Shdr * symtab_hdr;
3332   bfd_boolean free_internal = FALSE, free_external = FALSE;
3333   char * st_info_str;
3334   char * st_info_stb_str;
3335   char * st_other_str;
3336   char * st_shndx_str;
3337
3338   if (! internal_syms)
3339     {
3340       internal_syms = bfd_malloc (1000);
3341       free_internal = 1;
3342     }
3343   if (! external_syms)
3344     {
3345       external_syms = bfd_malloc (1000);
3346       free_external = 1;
3347     }
3348
3349   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3350   locsymcount = symtab_hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
3351   if (free_internal)
3352     isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3353                                     symtab_hdr->sh_info, 0,
3354                                     internal_syms, external_syms, NULL);
3355   else
3356     isymbuf = internal_syms;
3357   isymend = isymbuf + locsymcount;
3358
3359   for (isym = isymbuf ; isym < isymend ; isym++)
3360     {
3361       switch (ELF_ST_TYPE (isym->st_info))
3362         {
3363         case STT_FUNC: st_info_str = "STT_FUNC"; break;
3364         case STT_SECTION: st_info_str = "STT_SECTION"; break;
3365         case STT_FILE: st_info_str = "STT_FILE"; break;
3366         case STT_OBJECT: st_info_str = "STT_OBJECT"; break;
3367         case STT_TLS: st_info_str = "STT_TLS"; break;
3368         default: st_info_str = "";
3369         }
3370       switch (ELF_ST_BIND (isym->st_info))
3371         {
3372         case STB_LOCAL: st_info_stb_str = "STB_LOCAL"; break;
3373         case STB_GLOBAL: st_info_stb_str = "STB_GLOBAL"; break;
3374         default: st_info_stb_str = "";
3375         }
3376       switch (ELF_ST_VISIBILITY (isym->st_other))
3377         {
3378         case STV_DEFAULT: st_other_str = "STV_DEFAULT"; break;
3379         case STV_INTERNAL: st_other_str = "STV_INTERNAL"; break;
3380         case STV_PROTECTED: st_other_str = "STV_PROTECTED"; break;
3381         default: st_other_str = "";
3382         }
3383       switch (isym->st_shndx)
3384         {
3385         case SHN_ABS: st_shndx_str = "SHN_ABS"; break;
3386         case SHN_COMMON: st_shndx_str = "SHN_COMMON"; break;
3387         case SHN_UNDEF: st_shndx_str = "SHN_UNDEF"; break;
3388         default: st_shndx_str = "";
3389         }
3390
3391       printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
3392               "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
3393               isym,
3394               (unsigned long) isym->st_value,
3395               (unsigned long) isym->st_size,
3396               isym->st_name,
3397               bfd_elf_string_from_elf_section (abfd, symtab_hdr->sh_link,
3398                                                isym->st_name),
3399               isym->st_info, st_info_str, st_info_stb_str,
3400               isym->st_other, st_other_str,
3401               isym->st_shndx, st_shndx_str);
3402     }
3403   if (free_internal)
3404     free (internal_syms);
3405   if (free_external)
3406     free (external_syms);
3407 }
3408
3409 char *
3410 rx_get_reloc (long reloc)
3411 {
3412   if (0 <= reloc && reloc < R_RX_max)
3413     return rx_elf_howto_table[reloc].name;
3414   return "";
3415 }
3416 #endif /* DEBUG */
3417
3418 \f
3419 /* We must take care to keep the on-disk copy of any code sections
3420    that are fully linked swapped if the target is big endian, to match
3421    the Renesas tools.  */
3422
3423 /* The rule is: big endian object that are final-link executables,
3424    have code sections stored with 32-bit words swapped relative to
3425    what you'd get by default.  */
3426
3427 static bfd_boolean
3428 rx_get_section_contents (bfd *         abfd,
3429                          sec_ptr       section,
3430                          void *        location,
3431                          file_ptr      offset,
3432                          bfd_size_type count)
3433 {
3434   int exec = (abfd->flags & EXEC_P) ? 1 : 0;
3435   int s_code = (section->flags & SEC_CODE) ? 1 : 0;
3436   bfd_boolean rv;
3437
3438 #ifdef DJDEBUG
3439   fprintf (stderr, "dj: get %ld %ld from %s  %s e%d sc%d  %08lx:%08lx\n",
3440            (long) offset, (long) count, section->name,
3441            bfd_big_endian(abfd) ? "be" : "le",
3442            exec, s_code, (long unsigned) section->filepos,
3443            (long unsigned) offset);
3444 #endif
3445
3446   if (exec && s_code && bfd_big_endian (abfd))
3447     {
3448       char * cloc = (char *) location;
3449       bfd_size_type cnt, end_cnt;
3450
3451       rv = TRUE;
3452
3453       /* Fetch and swap unaligned bytes at the beginning.  */
3454       if (offset % 4)
3455         {
3456           char buf[4];
3457
3458           rv = _bfd_generic_get_section_contents (abfd, section, buf,
3459                                                   (offset & -4), 4);
3460           if (!rv)
3461             return FALSE;
3462
3463           bfd_putb32 (bfd_getl32 (buf), buf);
3464
3465           cnt = 4 - (offset % 4);
3466           if (cnt > count)
3467             cnt = count;
3468
3469           memcpy (location, buf + (offset % 4), cnt);
3470
3471           count -= cnt;
3472           offset += cnt;
3473           cloc += count;
3474         }
3475
3476       end_cnt = count % 4;
3477
3478       /* Fetch and swap the middle bytes.  */
3479       if (count >= 4)
3480         {
3481           rv = _bfd_generic_get_section_contents (abfd, section, cloc, offset,
3482                                                   count - end_cnt);
3483           if (!rv)
3484             return FALSE;
3485
3486           for (cnt = count; cnt >= 4; cnt -= 4, cloc += 4)
3487             bfd_putb32 (bfd_getl32 (cloc), cloc);
3488         }
3489
3490       /* Fetch and swap the end bytes.  */
3491       if (end_cnt > 0)
3492         {
3493           char buf[4];
3494
3495           /* Fetch the end bytes.  */
3496           rv = _bfd_generic_get_section_contents (abfd, section, buf,
3497                                                   offset + count - end_cnt, 4);
3498           if (!rv)
3499             return FALSE;
3500
3501           bfd_putb32 (bfd_getl32 (buf), buf);
3502           memcpy (cloc, buf, end_cnt);
3503         }
3504     }
3505   else
3506     rv = _bfd_generic_get_section_contents (abfd, section, location, offset, count);
3507
3508   return rv;
3509 }
3510
3511 #ifdef DJDEBUG
3512 static bfd_boolean
3513 rx2_set_section_contents (bfd *        abfd,
3514                          sec_ptr       section,
3515                          const void *  location,
3516                          file_ptr      offset,
3517                          bfd_size_type count)
3518 {
3519   bfd_size_type i;
3520
3521   fprintf (stderr, "   set sec %s %08x loc %p offset %#x count %#x\n",
3522            section->name, (unsigned) section->vma, location, (int) offset, (int) count);
3523   for (i = 0; i < count; i++)
3524     {
3525       if (i % 16 == 0 && i > 0)
3526         fprintf (stderr, "\n");
3527
3528       if (i % 16  && i % 4 == 0)
3529         fprintf (stderr, " ");
3530
3531       if (i % 16 == 0)
3532         fprintf (stderr, "      %08x:", (int) (section->vma + offset + i));
3533
3534       fprintf (stderr, " %02x", ((unsigned char *) location)[i]);
3535     }
3536   fprintf (stderr, "\n");
3537
3538   return _bfd_elf_set_section_contents (abfd, section, location, offset, count);
3539 }
3540 #define _bfd_elf_set_section_contents rx2_set_section_contents
3541 #endif
3542
3543 static bfd_boolean
3544 rx_set_section_contents (bfd *         abfd,
3545                          sec_ptr       section,
3546                          const void *  location,
3547                          file_ptr      offset,
3548                          bfd_size_type count)
3549 {
3550   bfd_boolean exec = (abfd->flags & EXEC_P) ? TRUE : FALSE;
3551   bfd_boolean s_code = (section->flags & SEC_CODE) ? TRUE : FALSE;
3552   bfd_boolean rv;
3553   char * swapped_data = NULL;
3554   bfd_size_type i;
3555   bfd_vma caddr = section->vma + offset;
3556   file_ptr faddr = 0;
3557   bfd_size_type scount;
3558
3559 #ifdef DJDEBUG
3560   bfd_size_type i;
3561
3562   fprintf (stderr, "\ndj: set %ld %ld to %s  %s e%d sc%d\n",
3563            (long) offset, (long) count, section->name,
3564            bfd_big_endian (abfd) ? "be" : "le",
3565            exec, s_code);
3566
3567   for (i = 0; i < count; i++)
3568     {
3569       int a = section->vma + offset + i;
3570
3571       if (a % 16 == 0 && a > 0)
3572         fprintf (stderr, "\n");
3573
3574       if (a % 16  && a % 4 == 0)
3575         fprintf (stderr, " ");
3576
3577       if (a % 16 == 0 || i == 0)
3578         fprintf (stderr, "      %08x:", (int) (section->vma + offset + i));
3579
3580       fprintf (stderr, " %02x", ((unsigned char *) location)[i]);
3581     }
3582
3583   fprintf (stderr, "\n");
3584 #endif
3585
3586   if (! exec || ! s_code || ! bfd_big_endian (abfd))
3587     return _bfd_elf_set_section_contents (abfd, section, location, offset, count);
3588
3589   while (count > 0 && caddr > 0 && caddr % 4)
3590     {
3591       switch (caddr % 4)
3592         {
3593         case 0: faddr = offset + 3; break;
3594         case 1: faddr = offset + 1; break;
3595         case 2: faddr = offset - 1; break;
3596         case 3: faddr = offset - 3; break;
3597         }
3598
3599       rv = _bfd_elf_set_section_contents (abfd, section, location, faddr, 1);
3600       if (! rv)
3601         return rv;
3602
3603       location = (bfd_byte *) location + 1;
3604       offset ++;
3605       count --;
3606       caddr ++;
3607     }
3608
3609   scount = (int)(count / 4) * 4;
3610   if (scount > 0)
3611     {
3612       char * cloc = (char *) location;
3613
3614       swapped_data = (char *) bfd_alloc (abfd, count);
3615
3616       for (i = 0; i < count; i += 4)
3617         {
3618           bfd_vma v = bfd_getl32 (cloc + i);
3619           bfd_putb32 (v, swapped_data + i);
3620         }
3621
3622       rv = _bfd_elf_set_section_contents (abfd, section, swapped_data, offset, scount);
3623
3624       if (!rv)
3625         return rv;
3626     }
3627
3628   count -= scount;
3629   location = (bfd_byte *) location + scount;
3630   offset += scount;
3631
3632   if (count > 0)
3633     {
3634       caddr = section->vma + offset;
3635       while (count > 0)
3636         {
3637           switch (caddr % 4)
3638             {
3639             case 0: faddr = offset + 3; break;
3640             case 1: faddr = offset + 1; break;
3641             case 2: faddr = offset - 1; break;
3642             case 3: faddr = offset - 3; break;
3643             }
3644           rv = _bfd_elf_set_section_contents (abfd, section, location, faddr, 1);
3645           if (! rv)
3646             return rv;
3647
3648           location = (bfd_byte *) location + 1;
3649           offset ++;
3650           count --;
3651           caddr ++;
3652         }
3653     }
3654
3655   return TRUE;
3656 }
3657
3658 static bfd_boolean
3659 rx_final_link (bfd * abfd, struct bfd_link_info * info)
3660 {
3661   asection * o;
3662
3663   for (o = abfd->sections; o != NULL; o = o->next)
3664     {
3665 #ifdef DJDEBUG
3666       fprintf (stderr, "sec %s fl %x vma %lx lma %lx size %lx raw %lx\n",
3667                o->name, o->flags, o->vma, o->lma, o->size, o->rawsize);
3668 #endif
3669       if (o->flags & SEC_CODE
3670           && bfd_big_endian (abfd)
3671           && o->size % 4)
3672         {
3673 #ifdef DJDEBUG
3674           fprintf (stderr, "adjusting...\n");
3675 #endif
3676           o->size += 4 - (o->size % 4);
3677         }
3678     }
3679
3680   return bfd_elf_final_link (abfd, info);
3681 }
3682
3683 static bfd_boolean
3684 elf32_rx_modify_program_headers (bfd * abfd ATTRIBUTE_UNUSED,
3685                                  struct bfd_link_info * info ATTRIBUTE_UNUSED)
3686 {
3687   const struct elf_backend_data * bed;
3688   struct elf_obj_tdata * tdata;
3689   Elf_Internal_Phdr * phdr;
3690   unsigned int count;
3691   unsigned int i;
3692
3693   bed = get_elf_backend_data (abfd);
3694   tdata = elf_tdata (abfd);
3695   phdr = tdata->phdr;
3696   count = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
3697
3698   if (ignore_lma)
3699     for (i = count; i-- != 0;)
3700       if (phdr[i].p_type == PT_LOAD)
3701         {
3702           /* The Renesas tools expect p_paddr to be zero.  However,
3703              there is no other way to store the writable data in ROM for
3704              startup initialization.  So, we let the linker *think*
3705              we're using paddr and vaddr the "usual" way, but at the
3706              last minute we move the paddr into the vaddr (which is what
3707              the simulator uses) and zero out paddr.  Note that this
3708              does not affect the section headers, just the program
3709              headers.  We hope.  */
3710           phdr[i].p_vaddr = phdr[i].p_paddr;
3711 #if 0     /* If we zero out p_paddr, then the LMA in the section table
3712              becomes wrong.  */
3713           phdr[i].p_paddr = 0;
3714 #endif
3715         }
3716
3717   return TRUE;
3718 }
3719
3720 /* The default literal sections should always be marked as "code" (i.e.,
3721    SHF_EXECINSTR).  This is particularly important for big-endian mode
3722    when we do not want their contents byte reversed.  */
3723 static const struct bfd_elf_special_section elf32_rx_special_sections[] =
3724 {
3725   { STRING_COMMA_LEN (".init_array"),    0, SHT_INIT_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3726   { STRING_COMMA_LEN (".fini_array"),    0, SHT_FINI_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3727   { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3728   { NULL,                        0,      0, 0,            0 }
3729 };
3730 \f
3731 typedef struct {
3732   bfd *abfd;
3733   struct bfd_link_info *info;
3734   bfd_vma table_start;
3735   int table_size;
3736   bfd_vma *table_handlers;
3737   bfd_vma table_default_handler;
3738   struct bfd_link_hash_entry **table_entries;
3739   struct bfd_link_hash_entry *table_default_entry;
3740   FILE *mapfile;
3741 } RX_Table_Info;
3742
3743 static bfd_boolean
3744 rx_table_find (struct bfd_hash_entry *vent, void *vinfo)
3745 {
3746   RX_Table_Info *info = (RX_Table_Info *)vinfo;
3747   struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3748   const char *name; /* of the symbol we've found */
3749   asection *sec;
3750   struct bfd *abfd;
3751   int idx;
3752   const char *tname; /* name of the table */
3753   bfd_vma start_addr, end_addr;
3754   char *buf;
3755   struct bfd_link_hash_entry * h;
3756
3757   /* We're looking for globally defined symbols of the form
3758      $tablestart$<NAME>.  */
3759   if (ent->type != bfd_link_hash_defined
3760       && ent->type != bfd_link_hash_defweak)
3761     return TRUE;
3762
3763   name = ent->root.string;
3764   sec = ent->u.def.section;
3765   abfd = sec->owner;
3766
3767   if (strncmp (name, "$tablestart$", 12))
3768     return TRUE;
3769
3770   sec->flags |= SEC_KEEP;
3771
3772   tname = name + 12;
3773
3774   start_addr = ent->u.def.value;
3775
3776   /* At this point, we can't build the table but we can (and must)
3777      find all the related symbols and mark their sections as SEC_KEEP
3778      so we don't garbage collect them.  */
3779
3780   buf = (char *) malloc (12 + 10 + strlen (tname));
3781
3782   sprintf (buf, "$tableend$%s", tname);
3783   h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3784   if (!h || (h->type != bfd_link_hash_defined
3785              && h->type != bfd_link_hash_defweak))
3786     {
3787       /* xgettext:c-format */
3788       _bfd_error_handler (_("%pB:%pA: table %s missing corresponding %s"),
3789                           abfd, sec, name, buf);
3790       return TRUE;
3791     }
3792
3793   if (h->u.def.section != ent->u.def.section)
3794     {
3795       /* xgettext:c-format */
3796       _bfd_error_handler (_("%pB:%pA: %s and %s must be in the same input section"),
3797                           h->u.def.section->owner, h->u.def.section,
3798                           name, buf);
3799       return TRUE;
3800     }
3801
3802   end_addr = h->u.def.value;
3803
3804   sprintf (buf, "$tableentry$default$%s", tname);
3805   h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3806   if (h && (h->type == bfd_link_hash_defined
3807             || h->type == bfd_link_hash_defweak))
3808     {
3809       h->u.def.section->flags |= SEC_KEEP;
3810     }
3811
3812   for (idx = 0; idx < (int) (end_addr - start_addr) / 4; idx ++)
3813     {
3814       sprintf (buf, "$tableentry$%d$%s", idx, tname);
3815       h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3816       if (h && (h->type == bfd_link_hash_defined
3817                 || h->type == bfd_link_hash_defweak))
3818         {
3819           h->u.def.section->flags |= SEC_KEEP;
3820         }
3821     }
3822
3823   /* Return TRUE to keep scanning, FALSE to end the traversal.  */
3824   return TRUE;
3825 }
3826
3827 /* We need to check for table entry symbols and build the tables, and
3828    we need to do it before the linker does garbage collection.  This function is
3829    called once per input object file.  */
3830 static bfd_boolean
3831 rx_check_directives
3832     (bfd *                     abfd ATTRIBUTE_UNUSED,
3833      struct bfd_link_info *    info ATTRIBUTE_UNUSED)
3834 {
3835   RX_Table_Info stuff;
3836
3837   stuff.abfd = abfd;
3838   stuff.info = info;
3839   bfd_hash_traverse (&(info->hash->table), rx_table_find, &stuff);
3840
3841   return TRUE;
3842 }
3843
3844 \f
3845 static bfd_boolean
3846 rx_table_map_2 (struct bfd_hash_entry *vent, void *vinfo)
3847 {
3848   RX_Table_Info *info = (RX_Table_Info *)vinfo;
3849   struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3850   int idx;
3851   const char *name;
3852   bfd_vma addr;
3853
3854   /* See if the symbol ENT has an address listed in the table, and
3855      isn't a debug/special symbol.  If so, put it in the table.  */
3856
3857   if (ent->type != bfd_link_hash_defined
3858       && ent->type != bfd_link_hash_defweak)
3859     return TRUE;
3860
3861   name = ent->root.string;
3862
3863   if (name[0] == '$' || name[0] == '.' || name[0] < ' ')
3864     return TRUE;
3865
3866   addr = (ent->u.def.value
3867           + ent->u.def.section->output_section->vma
3868           + ent->u.def.section->output_offset);
3869
3870   for (idx = 0; idx < info->table_size; idx ++)
3871     if (addr == info->table_handlers[idx])
3872       info->table_entries[idx] = ent;
3873
3874   if (addr == info->table_default_handler)
3875     info->table_default_entry = ent;
3876
3877   return TRUE;
3878 }
3879
3880 static bfd_boolean
3881 rx_table_map (struct bfd_hash_entry *vent, void *vinfo)
3882 {
3883   RX_Table_Info *info = (RX_Table_Info *)vinfo;
3884   struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3885   const char *name; /* of the symbol we've found */
3886   int idx;
3887   const char *tname; /* name of the table */
3888   bfd_vma start_addr, end_addr;
3889   char *buf;
3890   struct bfd_link_hash_entry * h;
3891   int need_elipses;
3892
3893   /* We're looking for globally defined symbols of the form
3894      $tablestart$<NAME>.  */
3895   if (ent->type != bfd_link_hash_defined
3896       && ent->type != bfd_link_hash_defweak)
3897     return TRUE;
3898
3899   name = ent->root.string;
3900
3901   if (strncmp (name, "$tablestart$", 12))
3902     return TRUE;
3903
3904   tname = name + 12;
3905   start_addr = (ent->u.def.value
3906                 + ent->u.def.section->output_section->vma
3907                 + ent->u.def.section->output_offset);
3908
3909   buf = (char *) malloc (12 + 10 + strlen (tname));
3910
3911   sprintf (buf, "$tableend$%s", tname);
3912   end_addr = get_symbol_value_maybe (buf, info->info);
3913
3914   sprintf (buf, "$tableentry$default$%s", tname);
3915   h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3916   if (h)
3917     {
3918       info->table_default_handler = (h->u.def.value
3919                                      + h->u.def.section->output_section->vma
3920                                      + h->u.def.section->output_offset);
3921     }
3922   else
3923     /* Zero is a valid handler address!  */
3924     info->table_default_handler = (bfd_vma) (-1);
3925   info->table_default_entry = NULL;
3926
3927   info->table_start = start_addr;
3928   info->table_size = (int) (end_addr - start_addr) / 4;
3929   info->table_handlers = (bfd_vma *) malloc (info->table_size * sizeof (bfd_vma));
3930   info->table_entries = (struct bfd_link_hash_entry **) malloc (info->table_size * sizeof (struct bfd_link_hash_entry));
3931
3932   for (idx = 0; idx < (int) (end_addr - start_addr) / 4; idx ++)
3933     {
3934       sprintf (buf, "$tableentry$%d$%s", idx, tname);
3935       h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3936       if (h && (h->type == bfd_link_hash_defined
3937                 || h->type == bfd_link_hash_defweak))
3938         {
3939           info->table_handlers[idx] = (h->u.def.value
3940                                        + h->u.def.section->output_section->vma
3941                                        + h->u.def.section->output_offset);
3942         }
3943       else
3944         info->table_handlers[idx] = info->table_default_handler;
3945       info->table_entries[idx] = NULL;
3946     }
3947
3948   free (buf);
3949
3950   bfd_hash_traverse (&(info->info->hash->table), rx_table_map_2, info);
3951
3952   fprintf (info->mapfile, "\nRX Vector Table: %s has %d entries at 0x%08" BFD_VMA_FMT "x\n\n",
3953            tname, info->table_size, start_addr);
3954
3955   if (info->table_default_entry)
3956     fprintf (info->mapfile, "  default handler is: %s at 0x%08" BFD_VMA_FMT "x\n",
3957              info->table_default_entry->root.string,
3958              info->table_default_handler);
3959   else if (info->table_default_handler != (bfd_vma)(-1))
3960     fprintf (info->mapfile, "  default handler is at 0x%08" BFD_VMA_FMT "x\n",
3961              info->table_default_handler);
3962   else
3963     fprintf (info->mapfile, "  no default handler\n");
3964
3965   need_elipses = 1;
3966   for (idx = 0; idx < info->table_size; idx ++)
3967     {
3968       if (info->table_handlers[idx] == info->table_default_handler)
3969         {
3970           if (need_elipses)
3971             fprintf (info->mapfile, "  . . .\n");
3972           need_elipses = 0;
3973           continue;
3974         }
3975       need_elipses = 1;
3976
3977       fprintf (info->mapfile, "  0x%08" BFD_VMA_FMT "x [%3d] ", start_addr + 4 * idx, idx);
3978
3979       if (info->table_handlers[idx] == (bfd_vma) (-1))
3980         fprintf (info->mapfile, "(no handler found)\n");
3981
3982       else if (info->table_handlers[idx] == info->table_default_handler)
3983         {
3984           if (info->table_default_entry)
3985             fprintf (info->mapfile, "(default)\n");
3986           else
3987             fprintf (info->mapfile, "(default)\n");
3988         }
3989
3990       else if (info->table_entries[idx])
3991         {
3992           fprintf (info->mapfile, "0x%08" BFD_VMA_FMT "x %s\n", info->table_handlers[idx], info->table_entries[idx]->root.string);
3993         }
3994
3995       else
3996         {
3997           fprintf (info->mapfile, "0x%08" BFD_VMA_FMT "x ???\n", info->table_handlers[idx]);
3998         }
3999     }
4000   if (need_elipses)
4001     fprintf (info->mapfile, "  . . .\n");
4002
4003   return TRUE;
4004 }
4005
4006 void
4007 rx_additional_link_map_text (bfd *obfd, struct bfd_link_info *info, FILE *mapfile)
4008 {
4009   /* We scan the symbol table looking for $tableentry$'s, and for
4010      each, try to deduce which handlers go with which entries.  */
4011
4012   RX_Table_Info stuff;
4013
4014   stuff.abfd = obfd;
4015   stuff.info = info;
4016   stuff.mapfile = mapfile;
4017   bfd_hash_traverse (&(info->hash->table), rx_table_map, &stuff);
4018 }
4019
4020 \f
4021 #define ELF_ARCH                bfd_arch_rx
4022 #define ELF_MACHINE_CODE        EM_RX
4023 #define ELF_MAXPAGESIZE         0x1000
4024
4025 #define TARGET_BIG_SYM          rx_elf32_be_vec
4026 #define TARGET_BIG_NAME         "elf32-rx-be"
4027
4028 #define TARGET_LITTLE_SYM       rx_elf32_le_vec
4029 #define TARGET_LITTLE_NAME      "elf32-rx-le"
4030
4031 #define elf_info_to_howto_rel                   NULL
4032 #define elf_info_to_howto                       rx_info_to_howto_rela
4033 #define elf_backend_object_p                    rx_elf_object_p
4034 #define elf_backend_relocate_section            rx_elf_relocate_section
4035 #define elf_symbol_leading_char                 ('_')
4036 #define elf_backend_can_gc_sections             1
4037 #define elf_backend_modify_program_headers      elf32_rx_modify_program_headers
4038
4039 #define bfd_elf32_bfd_reloc_type_lookup         rx_reloc_type_lookup
4040 #define bfd_elf32_bfd_reloc_name_lookup         rx_reloc_name_lookup
4041 #define bfd_elf32_bfd_set_private_flags         rx_elf_set_private_flags
4042 #define bfd_elf32_bfd_merge_private_bfd_data    rx_elf_merge_private_bfd_data
4043 #define bfd_elf32_bfd_print_private_bfd_data    rx_elf_print_private_bfd_data
4044 #define bfd_elf32_get_section_contents          rx_get_section_contents
4045 #define bfd_elf32_set_section_contents          rx_set_section_contents
4046 #define bfd_elf32_bfd_final_link                rx_final_link
4047 #define bfd_elf32_bfd_relax_section             elf32_rx_relax_section_wrapper
4048 #define elf_backend_special_sections            elf32_rx_special_sections
4049 #define elf_backend_check_directives            rx_check_directives
4050
4051 #include "elf32-target.h"
4052
4053 /* We define a second big-endian target that doesn't have the custom
4054    section get/set hooks, for times when we want to preserve the
4055    pre-swapped .text sections (like objcopy).  */
4056
4057 #undef  TARGET_BIG_SYM
4058 #define TARGET_BIG_SYM          rx_elf32_be_ns_vec
4059 #undef  TARGET_BIG_NAME
4060 #define TARGET_BIG_NAME         "elf32-rx-be-ns"
4061 #undef  TARGET_LITTLE_SYM
4062
4063 #undef bfd_elf32_get_section_contents
4064 #undef bfd_elf32_set_section_contents
4065
4066 #undef  elf32_bed
4067 #define elf32_bed                               elf32_rx_be_ns_bed
4068
4069 #include "elf32-target.h"
4070
4071 #undef  TARGET_LITTLE_SYM
4072 #define TARGET_LITTLE_SYM       rx_elf32_linux_le_vec
4073 #undef  TARGET_LITTLE_NAME
4074 #define TARGET_LITTLE_NAME      "elf32-rx-linux"
4075 #undef  TARGET_BIG_SYM
4076 #undef  TARGET_BIG_NAME
4077
4078 #undef  elf_backend_object_p
4079 #define elf_backend_object_p                    rx_linux_object_p
4080 #undef  elf_symbol_leading_char
4081 #undef  elf32_bed
4082 #define elf32_bed                               elf32_rx_le_linux_bed
4083
4084 #include "elf32-target.h"