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