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