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