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