Make bfd.link_next field a union
[deliverable/binutils-gdb.git] / bfd / elf32-rl78.c
1 /* Renesas RL78 specific support for 32-bit ELF.
2 Copyright (C) 2011-2014 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20 #include "sysdep.h"
21 #include "bfd.h"
22 #include "bfd_stdint.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/rl78.h"
26 #include "libiberty.h"
27
28 #define valid_16bit_address(v) ((v) <= 0x0ffff || (v) >= 0xf0000)
29
30 #define RL78REL(n,sz,bit,shift,complain,pcrel) \
31 HOWTO (R_RL78_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
32 bfd_elf_generic_reloc, "R_RL78_" #n, FALSE, 0, ~0, FALSE)
33
34 /* Note that the relocations around 0x7f are internal to this file;
35 feel free to move them as needed to avoid conflicts with published
36 relocation numbers. */
37
38 static reloc_howto_type rl78_elf_howto_table [] =
39 {
40 RL78REL (NONE, 0, 0, 0, dont, FALSE),
41 RL78REL (DIR32, 2, 32, 0, signed, FALSE),
42 RL78REL (DIR24S, 2, 24, 0, signed, FALSE),
43 RL78REL (DIR16, 1, 16, 0, dont, FALSE),
44 RL78REL (DIR16U, 1, 16, 0, unsigned, FALSE),
45 RL78REL (DIR16S, 1, 16, 0, signed, FALSE),
46 RL78REL (DIR8, 0, 8, 0, dont, FALSE),
47 RL78REL (DIR8U, 0, 8, 0, unsigned, FALSE),
48 RL78REL (DIR8S, 0, 8, 0, signed, FALSE),
49 RL78REL (DIR24S_PCREL, 2, 24, 0, signed, TRUE),
50 RL78REL (DIR16S_PCREL, 1, 16, 0, signed, TRUE),
51 RL78REL (DIR8S_PCREL, 0, 8, 0, signed, TRUE),
52 RL78REL (DIR16UL, 1, 16, 2, unsigned, FALSE),
53 RL78REL (DIR16UW, 1, 16, 1, unsigned, FALSE),
54 RL78REL (DIR8UL, 0, 8, 2, unsigned, FALSE),
55 RL78REL (DIR8UW, 0, 8, 1, unsigned, FALSE),
56 RL78REL (DIR32_REV, 1, 16, 0, dont, FALSE),
57 RL78REL (DIR16_REV, 1, 16, 0, dont, FALSE),
58 RL78REL (DIR3U_PCREL, 0, 3, 0, dont, TRUE),
59
60 EMPTY_HOWTO (0x13),
61 EMPTY_HOWTO (0x14),
62 EMPTY_HOWTO (0x15),
63 EMPTY_HOWTO (0x16),
64 EMPTY_HOWTO (0x17),
65 EMPTY_HOWTO (0x18),
66 EMPTY_HOWTO (0x19),
67 EMPTY_HOWTO (0x1a),
68 EMPTY_HOWTO (0x1b),
69 EMPTY_HOWTO (0x1c),
70 EMPTY_HOWTO (0x1d),
71 EMPTY_HOWTO (0x1e),
72 EMPTY_HOWTO (0x1f),
73
74 EMPTY_HOWTO (0x20),
75 EMPTY_HOWTO (0x21),
76 EMPTY_HOWTO (0x22),
77 EMPTY_HOWTO (0x23),
78 EMPTY_HOWTO (0x24),
79 EMPTY_HOWTO (0x25),
80 EMPTY_HOWTO (0x26),
81 EMPTY_HOWTO (0x27),
82 EMPTY_HOWTO (0x28),
83 EMPTY_HOWTO (0x29),
84 EMPTY_HOWTO (0x2a),
85 EMPTY_HOWTO (0x2b),
86 EMPTY_HOWTO (0x2c),
87 RL78REL (RH_RELAX, 0, 0, 0, dont, FALSE),
88
89 EMPTY_HOWTO (0x2e),
90 EMPTY_HOWTO (0x2f),
91 EMPTY_HOWTO (0x30),
92 EMPTY_HOWTO (0x31),
93 EMPTY_HOWTO (0x32),
94 EMPTY_HOWTO (0x33),
95 EMPTY_HOWTO (0x34),
96 EMPTY_HOWTO (0x35),
97 EMPTY_HOWTO (0x36),
98 EMPTY_HOWTO (0x37),
99 EMPTY_HOWTO (0x38),
100 EMPTY_HOWTO (0x39),
101 EMPTY_HOWTO (0x3a),
102 EMPTY_HOWTO (0x3b),
103 EMPTY_HOWTO (0x3c),
104 EMPTY_HOWTO (0x3d),
105 EMPTY_HOWTO (0x3e),
106 EMPTY_HOWTO (0x3f),
107 EMPTY_HOWTO (0x40),
108
109 RL78REL (ABS32, 2, 32, 0, dont, FALSE),
110 RL78REL (ABS24S, 2, 24, 0, signed, FALSE),
111 RL78REL (ABS16, 1, 16, 0, dont, FALSE),
112 RL78REL (ABS16U, 1, 16, 0, unsigned, FALSE),
113 RL78REL (ABS16S, 1, 16, 0, signed, FALSE),
114 RL78REL (ABS8, 0, 8, 0, dont, FALSE),
115 RL78REL (ABS8U, 0, 8, 0, unsigned, FALSE),
116 RL78REL (ABS8S, 0, 8, 0, signed, FALSE),
117 RL78REL (ABS24S_PCREL, 2, 24, 0, signed, TRUE),
118 RL78REL (ABS16S_PCREL, 1, 16, 0, signed, TRUE),
119 RL78REL (ABS8S_PCREL, 0, 8, 0, signed, TRUE),
120 RL78REL (ABS16UL, 1, 16, 0, unsigned, FALSE),
121 RL78REL (ABS16UW, 1, 16, 0, unsigned, FALSE),
122 RL78REL (ABS8UL, 0, 8, 0, unsigned, FALSE),
123 RL78REL (ABS8UW, 0, 8, 0, unsigned, FALSE),
124 RL78REL (ABS32_REV, 2, 32, 0, dont, FALSE),
125 RL78REL (ABS16_REV, 1, 16, 0, dont, FALSE),
126
127 #define STACK_REL_P(x) ((x) <= R_RL78_ABS16_REV && (x) >= R_RL78_ABS32)
128
129 EMPTY_HOWTO (0x52),
130 EMPTY_HOWTO (0x53),
131 EMPTY_HOWTO (0x54),
132 EMPTY_HOWTO (0x55),
133 EMPTY_HOWTO (0x56),
134 EMPTY_HOWTO (0x57),
135 EMPTY_HOWTO (0x58),
136 EMPTY_HOWTO (0x59),
137 EMPTY_HOWTO (0x5a),
138 EMPTY_HOWTO (0x5b),
139 EMPTY_HOWTO (0x5c),
140 EMPTY_HOWTO (0x5d),
141 EMPTY_HOWTO (0x5e),
142 EMPTY_HOWTO (0x5f),
143 EMPTY_HOWTO (0x60),
144 EMPTY_HOWTO (0x61),
145 EMPTY_HOWTO (0x62),
146 EMPTY_HOWTO (0x63),
147 EMPTY_HOWTO (0x64),
148 EMPTY_HOWTO (0x65),
149 EMPTY_HOWTO (0x66),
150 EMPTY_HOWTO (0x67),
151 EMPTY_HOWTO (0x68),
152 EMPTY_HOWTO (0x69),
153 EMPTY_HOWTO (0x6a),
154 EMPTY_HOWTO (0x6b),
155 EMPTY_HOWTO (0x6c),
156 EMPTY_HOWTO (0x6d),
157 EMPTY_HOWTO (0x6e),
158 EMPTY_HOWTO (0x6f),
159 EMPTY_HOWTO (0x70),
160 EMPTY_HOWTO (0x71),
161 EMPTY_HOWTO (0x72),
162 EMPTY_HOWTO (0x73),
163 EMPTY_HOWTO (0x74),
164 EMPTY_HOWTO (0x75),
165 EMPTY_HOWTO (0x76),
166 EMPTY_HOWTO (0x77),
167
168 EMPTY_HOWTO (0x78),
169 EMPTY_HOWTO (0x79),
170 EMPTY_HOWTO (0x7a),
171 EMPTY_HOWTO (0x7b),
172 EMPTY_HOWTO (0x7c),
173 EMPTY_HOWTO (0x7d),
174 EMPTY_HOWTO (0x7e),
175 EMPTY_HOWTO (0x7f),
176
177 RL78REL (SYM, 2, 32, 0, dont, FALSE),
178 RL78REL (OPneg, 2, 32, 0, dont, FALSE),
179 RL78REL (OPadd, 2, 32, 0, dont, FALSE),
180 RL78REL (OPsub, 2, 32, 0, dont, FALSE),
181 RL78REL (OPmul, 2, 32, 0, dont, FALSE),
182 RL78REL (OPdiv, 2, 32, 0, dont, FALSE),
183 RL78REL (OPshla, 2, 32, 0, dont, FALSE),
184 RL78REL (OPshra, 2, 32, 0, dont, FALSE),
185 RL78REL (OPsctsize, 2, 32, 0, dont, FALSE),
186 EMPTY_HOWTO (0x89),
187 EMPTY_HOWTO (0x8a),
188 EMPTY_HOWTO (0x8b),
189 EMPTY_HOWTO (0x8c),
190 RL78REL (OPscttop, 2, 32, 0, dont, FALSE),
191 EMPTY_HOWTO (0x8e),
192 EMPTY_HOWTO (0x8f),
193 RL78REL (OPand, 2, 32, 0, dont, FALSE),
194 RL78REL (OPor, 2, 32, 0, dont, FALSE),
195 RL78REL (OPxor, 2, 32, 0, dont, FALSE),
196 RL78REL (OPnot, 2, 32, 0, dont, FALSE),
197 RL78REL (OPmod, 2, 32, 0, dont, FALSE),
198 RL78REL (OPromtop, 2, 32, 0, dont, FALSE),
199 RL78REL (OPramtop, 2, 32, 0, dont, FALSE)
200 };
201 \f
202 /* Map BFD reloc types to RL78 ELF reloc types. */
203
204 struct rl78_reloc_map
205 {
206 bfd_reloc_code_real_type bfd_reloc_val;
207 unsigned int rl78_reloc_val;
208 };
209
210 static const struct rl78_reloc_map rl78_reloc_map [] =
211 {
212 { BFD_RELOC_NONE, R_RL78_NONE },
213 { BFD_RELOC_8, R_RL78_DIR8S },
214 { BFD_RELOC_16, R_RL78_DIR16S },
215 { BFD_RELOC_24, R_RL78_DIR24S },
216 { BFD_RELOC_32, R_RL78_DIR32 },
217 { BFD_RELOC_RL78_16_OP, R_RL78_DIR16 },
218 { BFD_RELOC_RL78_DIR3U_PCREL, R_RL78_DIR3U_PCREL },
219 { BFD_RELOC_8_PCREL, R_RL78_DIR8S_PCREL },
220 { BFD_RELOC_16_PCREL, R_RL78_DIR16S_PCREL },
221 { BFD_RELOC_24_PCREL, R_RL78_DIR24S_PCREL },
222 { BFD_RELOC_RL78_8U, R_RL78_DIR8U },
223 { BFD_RELOC_RL78_16U, R_RL78_DIR16U },
224 { BFD_RELOC_RL78_SYM, R_RL78_SYM },
225 { BFD_RELOC_RL78_OP_SUBTRACT, R_RL78_OPsub },
226 { BFD_RELOC_RL78_OP_NEG, R_RL78_OPneg },
227 { BFD_RELOC_RL78_OP_AND, R_RL78_OPand },
228 { BFD_RELOC_RL78_OP_SHRA, R_RL78_OPshra },
229 { BFD_RELOC_RL78_ABS8, R_RL78_ABS8 },
230 { BFD_RELOC_RL78_ABS16, R_RL78_ABS16 },
231 { BFD_RELOC_RL78_ABS16_REV, R_RL78_ABS16_REV },
232 { BFD_RELOC_RL78_ABS32, R_RL78_ABS32 },
233 { BFD_RELOC_RL78_ABS32_REV, R_RL78_ABS32_REV },
234 { BFD_RELOC_RL78_ABS16UL, R_RL78_ABS16UL },
235 { BFD_RELOC_RL78_ABS16UW, R_RL78_ABS16UW },
236 { BFD_RELOC_RL78_ABS16U, R_RL78_ABS16U },
237 { BFD_RELOC_RL78_RELAX, R_RL78_RH_RELAX }
238 };
239
240 static reloc_howto_type *
241 rl78_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
242 bfd_reloc_code_real_type code)
243 {
244 unsigned int i;
245
246 if (code == BFD_RELOC_RL78_32_OP)
247 return rl78_elf_howto_table + R_RL78_DIR32;
248
249 for (i = ARRAY_SIZE (rl78_reloc_map); --i;)
250 if (rl78_reloc_map [i].bfd_reloc_val == code)
251 return rl78_elf_howto_table + rl78_reloc_map[i].rl78_reloc_val;
252
253 return NULL;
254 }
255
256 static reloc_howto_type *
257 rl78_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED, const char * r_name)
258 {
259 unsigned int i;
260
261 for (i = 0; i < ARRAY_SIZE (rl78_elf_howto_table); i++)
262 if (rl78_elf_howto_table[i].name != NULL
263 && strcasecmp (rl78_elf_howto_table[i].name, r_name) == 0)
264 return rl78_elf_howto_table + i;
265
266 return NULL;
267 }
268
269 /* Set the howto pointer for an RL78 ELF reloc. */
270
271 static void
272 rl78_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
273 arelent * cache_ptr,
274 Elf_Internal_Rela * dst)
275 {
276 unsigned int r_type;
277
278 r_type = ELF32_R_TYPE (dst->r_info);
279 BFD_ASSERT (r_type < (unsigned int) R_RL78_max);
280 cache_ptr->howto = rl78_elf_howto_table + r_type;
281 }
282 \f
283 static bfd_vma
284 get_symbol_value (const char * name,
285 bfd_reloc_status_type * status,
286 struct bfd_link_info * info,
287 bfd * input_bfd,
288 asection * input_section,
289 int offset)
290 {
291 bfd_vma value = 0;
292 struct bfd_link_hash_entry * h;
293
294 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
295
296 if (h == NULL
297 || (h->type != bfd_link_hash_defined
298 && h->type != bfd_link_hash_defweak))
299 * status = info->callbacks->undefined_symbol
300 (info, name, input_bfd, input_section, offset, TRUE);
301 else
302 value = (h->u.def.value
303 + h->u.def.section->output_section->vma
304 + h->u.def.section->output_offset);
305
306 return value;
307 }
308
309 static bfd_vma
310 get_romstart (bfd_reloc_status_type * status,
311 struct bfd_link_info * info,
312 bfd * abfd,
313 asection * sec,
314 int offset)
315 {
316 static bfd_boolean cached = FALSE;
317 static bfd_vma cached_value = 0;
318
319 if (!cached)
320 {
321 cached_value = get_symbol_value ("_start", status, info, abfd, sec, offset);
322 cached = TRUE;
323 }
324 return cached_value;
325 }
326
327 static bfd_vma
328 get_ramstart (bfd_reloc_status_type * status,
329 struct bfd_link_info * info,
330 bfd * abfd,
331 asection * sec,
332 int offset)
333 {
334 static bfd_boolean cached = FALSE;
335 static bfd_vma cached_value = 0;
336
337 if (!cached)
338 {
339 cached_value = get_symbol_value ("__datastart", status, info, abfd, sec, offset);
340 cached = TRUE;
341 }
342 return cached_value;
343 }
344
345 #define NUM_STACK_ENTRIES 16
346 static int32_t rl78_stack [ NUM_STACK_ENTRIES ];
347 static unsigned int rl78_stack_top;
348
349 #define RL78_STACK_PUSH(val) \
350 do \
351 { \
352 if (rl78_stack_top < NUM_STACK_ENTRIES) \
353 rl78_stack [rl78_stack_top ++] = (val); \
354 else \
355 r = bfd_reloc_dangerous; \
356 } \
357 while (0)
358
359 #define RL78_STACK_POP(dest) \
360 do \
361 { \
362 if (rl78_stack_top > 0) \
363 (dest) = rl78_stack [-- rl78_stack_top]; \
364 else \
365 (dest) = 0, r = bfd_reloc_dangerous; \
366 } \
367 while (0)
368
369 /* Relocate an RL78 ELF section.
370 There is some attempt to make this function usable for many architectures,
371 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
372 if only to serve as a learning tool.
373
374 The RELOCATE_SECTION function is called by the new ELF backend linker
375 to handle the relocations for a section.
376
377 The relocs are always passed as Rela structures; if the section
378 actually uses Rel structures, the r_addend field will always be
379 zero.
380
381 This function is responsible for adjusting the section contents as
382 necessary, and (if using Rela relocs and generating a relocatable
383 output file) adjusting the reloc addend as necessary.
384
385 This function does not have to worry about setting the reloc
386 address or the reloc symbol index.
387
388 LOCAL_SYMS is a pointer to the swapped in local symbols.
389
390 LOCAL_SECTIONS is an array giving the section in the input file
391 corresponding to the st_shndx field of each local symbol.
392
393 The global hash table entry for the global symbols can be found
394 via elf_sym_hashes (input_bfd).
395
396 When generating relocatable output, this function must handle
397 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
398 going to be the section symbol corresponding to the output
399 section, which means that the addend must be adjusted
400 accordingly. */
401
402 static bfd_boolean
403 rl78_elf_relocate_section
404 (bfd * output_bfd,
405 struct bfd_link_info * info,
406 bfd * input_bfd,
407 asection * input_section,
408 bfd_byte * contents,
409 Elf_Internal_Rela * relocs,
410 Elf_Internal_Sym * local_syms,
411 asection ** local_sections)
412 {
413 Elf_Internal_Shdr * symtab_hdr;
414 struct elf_link_hash_entry ** sym_hashes;
415 Elf_Internal_Rela * rel;
416 Elf_Internal_Rela * relend;
417 bfd *dynobj;
418 asection *splt;
419
420 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
421 sym_hashes = elf_sym_hashes (input_bfd);
422 relend = relocs + input_section->reloc_count;
423
424 dynobj = elf_hash_table (info)->dynobj;
425 splt = NULL;
426 if (dynobj != NULL)
427 splt = bfd_get_linker_section (dynobj, ".plt");
428
429 for (rel = relocs; rel < relend; rel ++)
430 {
431 reloc_howto_type * howto;
432 unsigned long r_symndx;
433 Elf_Internal_Sym * sym;
434 asection * sec;
435 struct elf_link_hash_entry * h;
436 bfd_vma relocation;
437 bfd_reloc_status_type r;
438 const char * name = NULL;
439 bfd_boolean unresolved_reloc = TRUE;
440 int r_type;
441
442 r_type = ELF32_R_TYPE (rel->r_info);
443 r_symndx = ELF32_R_SYM (rel->r_info);
444
445 howto = rl78_elf_howto_table + ELF32_R_TYPE (rel->r_info);
446 h = NULL;
447 sym = NULL;
448 sec = NULL;
449 relocation = 0;
450
451 if (r_symndx < symtab_hdr->sh_info)
452 {
453 sym = local_syms + r_symndx;
454 sec = local_sections [r_symndx];
455 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, & sec, rel);
456
457 name = bfd_elf_string_from_elf_section
458 (input_bfd, symtab_hdr->sh_link, sym->st_name);
459 name = (sym->st_name == 0) ? bfd_section_name (input_bfd, sec) : name;
460 }
461 else
462 {
463 bfd_boolean warned ATTRIBUTE_UNUSED;
464 bfd_boolean ignored ATTRIBUTE_UNUSED;
465
466 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
467 r_symndx, symtab_hdr, sym_hashes, h,
468 sec, relocation, unresolved_reloc,
469 warned, ignored);
470
471 name = h->root.root.string;
472 }
473
474 if (sec != NULL && discarded_section (sec))
475 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
476 rel, 1, relend, howto, 0, contents);
477
478 if (info->relocatable)
479 {
480 /* This is a relocatable link. We don't have to change
481 anything, unless the reloc is against a section symbol,
482 in which case we have to adjust according to where the
483 section symbol winds up in the output section. */
484 if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
485 rel->r_addend += sec->output_offset;
486 continue;
487 }
488
489 switch (ELF32_R_TYPE (rel->r_info))
490 {
491 case R_RL78_DIR16S:
492 {
493 bfd_vma *plt_offset;
494
495 if (h != NULL)
496 plt_offset = &h->plt.offset;
497 else
498 plt_offset = elf_local_got_offsets (input_bfd) + r_symndx;
499
500 if (! valid_16bit_address (relocation))
501 {
502 /* If this is the first time we've processed this symbol,
503 fill in the plt entry with the correct symbol address. */
504 if ((*plt_offset & 1) == 0)
505 {
506 unsigned int x;
507
508 x = 0x000000ec; /* br !!abs24 */
509 x |= (relocation << 8) & 0xffffff00;
510 bfd_put_32 (input_bfd, x, splt->contents + *plt_offset);
511 *plt_offset |= 1;
512 }
513
514 relocation = (splt->output_section->vma
515 + splt->output_offset
516 + (*plt_offset & -2));
517 if (name)
518 {
519 char *newname = bfd_malloc (strlen(name)+5);
520 strcpy (newname, name);
521 strcat(newname, ".plt");
522 _bfd_generic_link_add_one_symbol (info,
523 input_bfd,
524 newname,
525 BSF_FUNCTION | BSF_WEAK,
526 splt,
527 (*plt_offset & -2),
528 0,
529 1,
530 0,
531 0);
532 }
533 }
534 }
535 break;
536 }
537
538 if (h != NULL && h->root.type == bfd_link_hash_undefweak)
539 /* If the symbol is undefined and weak
540 then the relocation resolves to zero. */
541 relocation = 0;
542 else
543 {
544 if (howto->pc_relative)
545 {
546 relocation -= (input_section->output_section->vma
547 + input_section->output_offset
548 + rel->r_offset);
549 relocation -= bfd_get_reloc_size (howto);
550 }
551
552 relocation += rel->r_addend;
553 }
554
555 r = bfd_reloc_ok;
556
557 #define RANGE(a,b) if (a > (long) relocation || (long) relocation > b) r = bfd_reloc_overflow
558 #define ALIGN(m) if (relocation & m) r = bfd_reloc_other;
559 #define OP(i) (contents[rel->r_offset + (i)])
560
561 /* Opcode relocs are always big endian. Data relocs are bi-endian. */
562 switch (r_type)
563 {
564 case R_RL78_NONE:
565 break;
566
567 case R_RL78_RH_RELAX:
568 break;
569
570 case R_RL78_DIR8S_PCREL:
571 RANGE (-128, 127);
572 OP (0) = relocation;
573 break;
574
575 case R_RL78_DIR8S:
576 RANGE (-128, 255);
577 OP (0) = relocation;
578 break;
579
580 case R_RL78_DIR8U:
581 RANGE (0, 255);
582 OP (0) = relocation;
583 break;
584
585 case R_RL78_DIR16S_PCREL:
586 RANGE (-32768, 32767);
587 OP (0) = relocation;
588 OP (1) = relocation >> 8;
589 break;
590
591 case R_RL78_DIR16S:
592 if ((relocation & 0xf0000) == 0xf0000)
593 relocation &= 0xffff;
594 RANGE (-32768, 65535);
595 OP (0) = relocation;
596 OP (1) = relocation >> 8;
597 break;
598
599 case R_RL78_DIR16U:
600 RANGE (0, 65536);
601 OP (0) = relocation;
602 OP (1) = relocation >> 8;
603 break;
604
605 case R_RL78_DIR16:
606 RANGE (-32768, 65536);
607 OP (0) = relocation;
608 OP (1) = relocation >> 8;
609 break;
610
611 case R_RL78_DIR16_REV:
612 RANGE (-32768, 65536);
613 OP (1) = relocation;
614 OP (0) = relocation >> 8;
615 break;
616
617 case R_RL78_DIR3U_PCREL:
618 RANGE (3, 10);
619 OP (0) &= 0xf8;
620 OP (0) |= relocation & 0x07;
621 break;
622
623 case R_RL78_DIR24S_PCREL:
624 RANGE (-0x800000, 0x7fffff);
625 OP (0) = relocation;
626 OP (1) = relocation >> 8;
627 OP (2) = relocation >> 16;
628 break;
629
630 case R_RL78_DIR24S:
631 RANGE (-0x800000, 0x7fffff);
632 OP (0) = relocation;
633 OP (1) = relocation >> 8;
634 OP (2) = relocation >> 16;
635 break;
636
637 case R_RL78_DIR32:
638 OP (0) = relocation;
639 OP (1) = relocation >> 8;
640 OP (2) = relocation >> 16;
641 OP (3) = relocation >> 24;
642 break;
643
644 case R_RL78_DIR32_REV:
645 OP (3) = relocation;
646 OP (2) = relocation >> 8;
647 OP (1) = relocation >> 16;
648 OP (0) = relocation >> 24;
649 break;
650
651 case R_RL78_RH_SFR:
652 RANGE (0xfff00, 0xfffff);
653 OP (0) = relocation & 0xff;
654 break;
655
656 case R_RL78_RH_SADDR:
657 RANGE (0xffe20, 0xfff1f);
658 OP (0) = relocation & 0xff;
659 break;
660
661 /* Complex reloc handling: */
662
663 case R_RL78_ABS32:
664 RL78_STACK_POP (relocation);
665 OP (0) = relocation;
666 OP (1) = relocation >> 8;
667 OP (2) = relocation >> 16;
668 OP (3) = relocation >> 24;
669 break;
670
671 case R_RL78_ABS32_REV:
672 RL78_STACK_POP (relocation);
673 OP (3) = relocation;
674 OP (2) = relocation >> 8;
675 OP (1) = relocation >> 16;
676 OP (0) = relocation >> 24;
677 break;
678
679 case R_RL78_ABS24S_PCREL:
680 case R_RL78_ABS24S:
681 RL78_STACK_POP (relocation);
682 RANGE (-0x800000, 0x7fffff);
683 OP (0) = relocation;
684 OP (1) = relocation >> 8;
685 OP (2) = relocation >> 16;
686 break;
687
688 case R_RL78_ABS16:
689 RL78_STACK_POP (relocation);
690 RANGE (-32768, 65535);
691 OP (0) = relocation;
692 OP (1) = relocation >> 8;
693 break;
694
695 case R_RL78_ABS16_REV:
696 RL78_STACK_POP (relocation);
697 RANGE (-32768, 65535);
698 OP (1) = relocation;
699 OP (0) = relocation >> 8;
700 break;
701
702 case R_RL78_ABS16S_PCREL:
703 case R_RL78_ABS16S:
704 RL78_STACK_POP (relocation);
705 RANGE (-32768, 32767);
706 OP (0) = relocation;
707 OP (1) = relocation >> 8;
708 break;
709
710 case R_RL78_ABS16U:
711 RL78_STACK_POP (relocation);
712 RANGE (0, 65536);
713 OP (0) = relocation;
714 OP (1) = relocation >> 8;
715 break;
716
717 case R_RL78_ABS16UL:
718 RL78_STACK_POP (relocation);
719 relocation >>= 2;
720 RANGE (0, 65536);
721 OP (0) = relocation;
722 OP (1) = relocation >> 8;
723 break;
724
725 case R_RL78_ABS16UW:
726 RL78_STACK_POP (relocation);
727 relocation >>= 1;
728 RANGE (0, 65536);
729 OP (0) = relocation;
730 OP (1) = relocation >> 8;
731 break;
732
733 case R_RL78_ABS8:
734 RL78_STACK_POP (relocation);
735 RANGE (-128, 255);
736 OP (0) = relocation;
737 break;
738
739 case R_RL78_ABS8U:
740 RL78_STACK_POP (relocation);
741 RANGE (0, 255);
742 OP (0) = relocation;
743 break;
744
745 case R_RL78_ABS8UL:
746 RL78_STACK_POP (relocation);
747 relocation >>= 2;
748 RANGE (0, 255);
749 OP (0) = relocation;
750 break;
751
752 case R_RL78_ABS8UW:
753 RL78_STACK_POP (relocation);
754 relocation >>= 1;
755 RANGE (0, 255);
756 OP (0) = relocation;
757 break;
758
759 case R_RL78_ABS8S_PCREL:
760 case R_RL78_ABS8S:
761 RL78_STACK_POP (relocation);
762 RANGE (-128, 127);
763 OP (0) = relocation;
764 break;
765
766 case R_RL78_SYM:
767 if (r_symndx < symtab_hdr->sh_info)
768 RL78_STACK_PUSH (sec->output_section->vma
769 + sec->output_offset
770 + sym->st_value
771 + rel->r_addend);
772 else
773 {
774 if (h != NULL
775 && (h->root.type == bfd_link_hash_defined
776 || h->root.type == bfd_link_hash_defweak))
777 RL78_STACK_PUSH (h->root.u.def.value
778 + sec->output_section->vma
779 + sec->output_offset
780 + rel->r_addend);
781 else if (h->root.type == bfd_link_hash_undefweak)
782 RL78_STACK_PUSH (0);
783 else
784 _bfd_error_handler (_("Warning: RL78_SYM reloc with an unknown symbol"));
785 }
786 break;
787
788 case R_RL78_OPneg:
789 {
790 int32_t tmp;
791
792 RL78_STACK_POP (tmp);
793 tmp = - tmp;
794 RL78_STACK_PUSH (tmp);
795 }
796 break;
797
798 case R_RL78_OPadd:
799 {
800 int32_t tmp1, tmp2;
801
802 RL78_STACK_POP (tmp2);
803 RL78_STACK_POP (tmp1);
804 tmp1 += tmp2;
805 RL78_STACK_PUSH (tmp1);
806 }
807 break;
808
809 case R_RL78_OPsub:
810 {
811 int32_t tmp1, tmp2;
812
813 /* For the expression "A - B", the assembler pushes A,
814 then B, then OPSUB. So the first op we pop is B, not
815 A. */
816 RL78_STACK_POP (tmp2); /* B */
817 RL78_STACK_POP (tmp1); /* A */
818 tmp1 -= tmp2; /* A - B */
819 RL78_STACK_PUSH (tmp1);
820 }
821 break;
822
823 case R_RL78_OPmul:
824 {
825 int32_t tmp1, tmp2;
826
827 RL78_STACK_POP (tmp2);
828 RL78_STACK_POP (tmp1);
829 tmp1 *= tmp2;
830 RL78_STACK_PUSH (tmp1);
831 }
832 break;
833
834 case R_RL78_OPdiv:
835 {
836 int32_t tmp1, tmp2;
837
838 RL78_STACK_POP (tmp2);
839 RL78_STACK_POP (tmp1);
840 tmp1 /= tmp2;
841 RL78_STACK_PUSH (tmp1);
842 }
843 break;
844
845 case R_RL78_OPshla:
846 {
847 int32_t tmp1, tmp2;
848
849 RL78_STACK_POP (tmp2);
850 RL78_STACK_POP (tmp1);
851 tmp1 <<= tmp2;
852 RL78_STACK_PUSH (tmp1);
853 }
854 break;
855
856 case R_RL78_OPshra:
857 {
858 int32_t tmp1, tmp2;
859
860 RL78_STACK_POP (tmp2);
861 RL78_STACK_POP (tmp1);
862 tmp1 >>= tmp2;
863 RL78_STACK_PUSH (tmp1);
864 }
865 break;
866
867 case R_RL78_OPsctsize:
868 RL78_STACK_PUSH (input_section->size);
869 break;
870
871 case R_RL78_OPscttop:
872 RL78_STACK_PUSH (input_section->output_section->vma);
873 break;
874
875 case R_RL78_OPand:
876 {
877 int32_t tmp1, tmp2;
878
879 RL78_STACK_POP (tmp2);
880 RL78_STACK_POP (tmp1);
881 tmp1 &= tmp2;
882 RL78_STACK_PUSH (tmp1);
883 }
884 break;
885
886 case R_RL78_OPor:
887 {
888 int32_t tmp1, tmp2;
889
890 RL78_STACK_POP (tmp2);
891 RL78_STACK_POP (tmp1);
892 tmp1 |= tmp2;
893 RL78_STACK_PUSH (tmp1);
894 }
895 break;
896
897 case R_RL78_OPxor:
898 {
899 int32_t tmp1, tmp2;
900
901 RL78_STACK_POP (tmp2);
902 RL78_STACK_POP (tmp1);
903 tmp1 ^= tmp2;
904 RL78_STACK_PUSH (tmp1);
905 }
906 break;
907
908 case R_RL78_OPnot:
909 {
910 int32_t tmp;
911
912 RL78_STACK_POP (tmp);
913 tmp = ~ tmp;
914 RL78_STACK_PUSH (tmp);
915 }
916 break;
917
918 case R_RL78_OPmod:
919 {
920 int32_t tmp1, tmp2;
921
922 RL78_STACK_POP (tmp2);
923 RL78_STACK_POP (tmp1);
924 tmp1 %= tmp2;
925 RL78_STACK_PUSH (tmp1);
926 }
927 break;
928
929 case R_RL78_OPromtop:
930 RL78_STACK_PUSH (get_romstart (&r, info, input_bfd, input_section, rel->r_offset));
931 break;
932
933 case R_RL78_OPramtop:
934 RL78_STACK_PUSH (get_ramstart (&r, info, input_bfd, input_section, rel->r_offset));
935 break;
936
937 default:
938 r = bfd_reloc_notsupported;
939 break;
940 }
941
942 if (r != bfd_reloc_ok)
943 {
944 const char * msg = NULL;
945
946 switch (r)
947 {
948 case bfd_reloc_overflow:
949 /* Catch the case of a missing function declaration
950 and emit a more helpful error message. */
951 if (r_type == R_RL78_DIR24S_PCREL)
952 msg = _("%B(%A): error: call to undefined function '%s'");
953 else
954 r = info->callbacks->reloc_overflow
955 (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
956 input_bfd, input_section, rel->r_offset);
957 break;
958
959 case bfd_reloc_undefined:
960 r = info->callbacks->undefined_symbol
961 (info, name, input_bfd, input_section, rel->r_offset,
962 TRUE);
963 break;
964
965 case bfd_reloc_other:
966 msg = _("%B(%A): warning: unaligned access to symbol '%s' in the small data area");
967 break;
968
969 case bfd_reloc_outofrange:
970 msg = _("%B(%A): internal error: out of range error");
971 break;
972
973 case bfd_reloc_notsupported:
974 msg = _("%B(%A): internal error: unsupported relocation error");
975 break;
976
977 case bfd_reloc_dangerous:
978 msg = _("%B(%A): internal error: dangerous relocation");
979 break;
980
981 default:
982 msg = _("%B(%A): internal error: unknown error");
983 break;
984 }
985
986 if (msg)
987 _bfd_error_handler (msg, input_bfd, input_section, name);
988
989 if (! r)
990 return FALSE;
991 }
992 }
993
994 return TRUE;
995 }
996 \f
997 /* Function to set the ELF flag bits. */
998
999 static bfd_boolean
1000 rl78_elf_set_private_flags (bfd * abfd, flagword flags)
1001 {
1002 elf_elfheader (abfd)->e_flags = flags;
1003 elf_flags_init (abfd) = TRUE;
1004 return TRUE;
1005 }
1006
1007 static bfd_boolean no_warn_mismatch = FALSE;
1008
1009 void bfd_elf32_rl78_set_target_flags (bfd_boolean);
1010
1011 void
1012 bfd_elf32_rl78_set_target_flags (bfd_boolean user_no_warn_mismatch)
1013 {
1014 no_warn_mismatch = user_no_warn_mismatch;
1015 }
1016
1017 /* Merge backend specific data from an object file to the output
1018 object file when linking. */
1019
1020 static bfd_boolean
1021 rl78_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
1022 {
1023 flagword new_flags;
1024 flagword old_flags;
1025 bfd_boolean error = FALSE;
1026
1027 new_flags = elf_elfheader (ibfd)->e_flags;
1028 old_flags = elf_elfheader (obfd)->e_flags;
1029
1030 if (!elf_flags_init (obfd))
1031 {
1032 /* First call, no flags set. */
1033 elf_flags_init (obfd) = TRUE;
1034 elf_elfheader (obfd)->e_flags = new_flags;
1035 }
1036 else if (old_flags != new_flags)
1037 {
1038 flagword changed_flags = old_flags ^ new_flags;
1039
1040 if (changed_flags & E_FLAG_RL78_G10)
1041 {
1042 (*_bfd_error_handler)
1043 (_("RL78/G10 ABI conflict: cannot link G10 and non-G10 objects together"));
1044
1045 if (old_flags & E_FLAG_RL78_G10)
1046 (*_bfd_error_handler) (_("- %s is G10, %s is not"),
1047 bfd_get_filename (obfd), bfd_get_filename (ibfd));
1048 else
1049 (*_bfd_error_handler) (_("- %s is G10, %s is not"),
1050 bfd_get_filename (ibfd), bfd_get_filename (obfd));
1051 }
1052
1053 if (changed_flags & E_FLAG_RL78_64BIT_DOUBLES)
1054 {
1055 (*_bfd_error_handler)
1056 (_("RL78 merge conflict: cannot link 32-bit and 64-bit objects together"));
1057
1058 if (old_flags & E_FLAG_RL78_64BIT_DOUBLES)
1059 (*_bfd_error_handler) (_("- %s is 64-bit, %s is not"),
1060 bfd_get_filename (obfd), bfd_get_filename (ibfd));
1061 else
1062 (*_bfd_error_handler) (_("- %s is 64-bit, %s is not"),
1063 bfd_get_filename (ibfd), bfd_get_filename (obfd));
1064 }
1065 }
1066
1067 return !error;
1068 }
1069 \f
1070 static bfd_boolean
1071 rl78_elf_print_private_bfd_data (bfd * abfd, void * ptr)
1072 {
1073 FILE * file = (FILE *) ptr;
1074 flagword flags;
1075
1076 BFD_ASSERT (abfd != NULL && ptr != NULL);
1077
1078 /* Print normal ELF private data. */
1079 _bfd_elf_print_private_bfd_data (abfd, ptr);
1080
1081 flags = elf_elfheader (abfd)->e_flags;
1082 fprintf (file, _("private flags = 0x%lx:"), (long) flags);
1083
1084 if (flags & E_FLAG_RL78_G10)
1085 fprintf (file, _(" [G10]"));
1086
1087 if (flags & E_FLAG_RL78_64BIT_DOUBLES)
1088 fprintf (file, _(" [64-bit doubles]"));
1089
1090 fputc ('\n', file);
1091 return TRUE;
1092 }
1093
1094 /* Return the MACH for an e_flags value. */
1095
1096 static int
1097 elf32_rl78_machine (bfd * abfd)
1098 {
1099 if ((elf_elfheader (abfd)->e_flags & EF_RL78_CPU_MASK) == EF_RL78_CPU_RL78)
1100 return bfd_mach_rl78;
1101
1102 return 0;
1103 }
1104
1105 static bfd_boolean
1106 rl78_elf_object_p (bfd * abfd)
1107 {
1108 bfd_default_set_arch_mach (abfd, bfd_arch_rl78,
1109 elf32_rl78_machine (abfd));
1110 return TRUE;
1111 }
1112 \f
1113 /* support PLT for 16-bit references to 24-bit functions. */
1114
1115 /* We support 16-bit pointers to code above 64k by generating a thunk
1116 below 64k containing a JMP instruction to the final address. */
1117
1118 static bfd_boolean
1119 rl78_elf_check_relocs
1120 (bfd * abfd,
1121 struct bfd_link_info * info,
1122 asection * sec,
1123 const Elf_Internal_Rela * relocs)
1124 {
1125 Elf_Internal_Shdr * symtab_hdr;
1126 struct elf_link_hash_entry ** sym_hashes;
1127 const Elf_Internal_Rela * rel;
1128 const Elf_Internal_Rela * rel_end;
1129 bfd_vma *local_plt_offsets;
1130 asection *splt;
1131 bfd *dynobj;
1132
1133 if (info->relocatable)
1134 return TRUE;
1135
1136 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1137 sym_hashes = elf_sym_hashes (abfd);
1138 local_plt_offsets = elf_local_got_offsets (abfd);
1139 splt = NULL;
1140 dynobj = elf_hash_table(info)->dynobj;
1141
1142 rel_end = relocs + sec->reloc_count;
1143 for (rel = relocs; rel < rel_end; rel++)
1144 {
1145 struct elf_link_hash_entry *h;
1146 unsigned long r_symndx;
1147 bfd_vma *offset;
1148
1149 r_symndx = ELF32_R_SYM (rel->r_info);
1150 if (r_symndx < symtab_hdr->sh_info)
1151 h = NULL;
1152 else
1153 {
1154 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1155 while (h->root.type == bfd_link_hash_indirect
1156 || h->root.type == bfd_link_hash_warning)
1157 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1158
1159 /* PR15323, ref flags aren't set for references in the same
1160 object. */
1161 h->root.non_ir_ref = 1;
1162 }
1163
1164 switch (ELF32_R_TYPE (rel->r_info))
1165 {
1166 /* This relocation describes a 16-bit pointer to a function.
1167 We may need to allocate a thunk in low memory; reserve memory
1168 for it now. */
1169 case R_RL78_DIR16S:
1170 if (dynobj == NULL)
1171 elf_hash_table (info)->dynobj = dynobj = abfd;
1172 if (splt == NULL)
1173 {
1174 splt = bfd_get_linker_section (dynobj, ".plt");
1175 if (splt == NULL)
1176 {
1177 flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1178 | SEC_IN_MEMORY | SEC_LINKER_CREATED
1179 | SEC_READONLY | SEC_CODE);
1180 splt = bfd_make_section_anyway_with_flags (dynobj, ".plt",
1181 flags);
1182 if (splt == NULL
1183 || ! bfd_set_section_alignment (dynobj, splt, 1))
1184 return FALSE;
1185 }
1186 }
1187
1188 if (h != NULL)
1189 offset = &h->plt.offset;
1190 else
1191 {
1192 if (local_plt_offsets == NULL)
1193 {
1194 size_t size;
1195 unsigned int i;
1196
1197 size = symtab_hdr->sh_info * sizeof (bfd_vma);
1198 local_plt_offsets = (bfd_vma *) bfd_alloc (abfd, size);
1199 if (local_plt_offsets == NULL)
1200 return FALSE;
1201 elf_local_got_offsets (abfd) = local_plt_offsets;
1202
1203 for (i = 0; i < symtab_hdr->sh_info; i++)
1204 local_plt_offsets[i] = (bfd_vma) -1;
1205 }
1206 offset = &local_plt_offsets[r_symndx];
1207 }
1208
1209 if (*offset == (bfd_vma) -1)
1210 {
1211 *offset = splt->size;
1212 splt->size += 4;
1213 }
1214 break;
1215 }
1216 }
1217
1218 return TRUE;
1219 }
1220
1221 /* This must exist if dynobj is ever set. */
1222
1223 static bfd_boolean
1224 rl78_elf_finish_dynamic_sections (bfd *abfd ATTRIBUTE_UNUSED,
1225 struct bfd_link_info *info)
1226 {
1227 bfd *dynobj;
1228 asection *splt;
1229
1230 if (!elf_hash_table (info)->dynamic_sections_created)
1231 return TRUE;
1232
1233 /* As an extra sanity check, verify that all plt entries have been
1234 filled in. However, relaxing might have changed the relocs so
1235 that some plt entries don't get filled in, so we have to skip
1236 this check if we're relaxing. Unfortunately, check_relocs is
1237 called before relaxation. */
1238
1239 if (info->relax_trip > 0)
1240 return TRUE;
1241
1242 if ((dynobj = elf_hash_table (info)->dynobj) != NULL
1243 && (splt = bfd_get_linker_section (dynobj, ".plt")) != NULL)
1244 {
1245 bfd_byte *contents = splt->contents;
1246 unsigned int i, size = splt->size;
1247
1248 for (i = 0; i < size; i += 4)
1249 {
1250 unsigned int x = bfd_get_32 (dynobj, contents + i);
1251 BFD_ASSERT (x != 0);
1252 }
1253 }
1254
1255 return TRUE;
1256 }
1257
1258 static bfd_boolean
1259 rl78_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1260 struct bfd_link_info *info)
1261 {
1262 bfd *dynobj;
1263 asection *splt;
1264
1265 if (info->relocatable)
1266 return TRUE;
1267
1268 dynobj = elf_hash_table (info)->dynobj;
1269 if (dynobj == NULL)
1270 return TRUE;
1271
1272 splt = bfd_get_linker_section (dynobj, ".plt");
1273 BFD_ASSERT (splt != NULL);
1274
1275 splt->contents = (bfd_byte *) bfd_zalloc (dynobj, splt->size);
1276 if (splt->contents == NULL)
1277 return FALSE;
1278
1279 return TRUE;
1280 }
1281
1282 \f
1283
1284 /* Handle relaxing. */
1285
1286 /* A subroutine of rl78_elf_relax_section. If the global symbol H
1287 is within the low 64k, remove any entry for it in the plt. */
1288
1289 struct relax_plt_data
1290 {
1291 asection *splt;
1292 bfd_boolean *again;
1293 };
1294
1295 static bfd_boolean
1296 rl78_relax_plt_check (struct elf_link_hash_entry *h, void * xdata)
1297 {
1298 struct relax_plt_data *data = (struct relax_plt_data *) xdata;
1299
1300 if (h->plt.offset != (bfd_vma) -1)
1301 {
1302 bfd_vma address;
1303
1304 if (h->root.type == bfd_link_hash_undefined
1305 || h->root.type == bfd_link_hash_undefweak)
1306 address = 0;
1307 else
1308 address = (h->root.u.def.section->output_section->vma
1309 + h->root.u.def.section->output_offset
1310 + h->root.u.def.value);
1311
1312 if (valid_16bit_address (address))
1313 {
1314 h->plt.offset = -1;
1315 data->splt->size -= 4;
1316 *data->again = TRUE;
1317 }
1318 }
1319
1320 return TRUE;
1321 }
1322
1323 /* A subroutine of rl78_elf_relax_section. If the global symbol H
1324 previously had a plt entry, give it a new entry offset. */
1325
1326 static bfd_boolean
1327 rl78_relax_plt_realloc (struct elf_link_hash_entry *h, void * xdata)
1328 {
1329 bfd_vma *entry = (bfd_vma *) xdata;
1330
1331 if (h->plt.offset != (bfd_vma) -1)
1332 {
1333 h->plt.offset = *entry;
1334 *entry += 4;
1335 }
1336
1337 return TRUE;
1338 }
1339
1340 static bfd_boolean
1341 rl78_elf_relax_plt_section (bfd *dynobj,
1342 asection *splt,
1343 struct bfd_link_info *info,
1344 bfd_boolean *again)
1345 {
1346 struct relax_plt_data relax_plt_data;
1347 bfd *ibfd;
1348
1349 /* Assume nothing changes. */
1350 *again = FALSE;
1351
1352 if (info->relocatable)
1353 return TRUE;
1354
1355 /* We only relax the .plt section at the moment. */
1356 if (dynobj != elf_hash_table (info)->dynobj
1357 || strcmp (splt->name, ".plt") != 0)
1358 return TRUE;
1359
1360 /* Quick check for an empty plt. */
1361 if (splt->size == 0)
1362 return TRUE;
1363
1364 /* Map across all global symbols; see which ones happen to
1365 fall in the low 64k. */
1366 relax_plt_data.splt = splt;
1367 relax_plt_data.again = again;
1368 elf_link_hash_traverse (elf_hash_table (info), rl78_relax_plt_check,
1369 &relax_plt_data);
1370
1371 /* Likewise for local symbols, though that's somewhat less convenient
1372 as we have to walk the list of input bfds and swap in symbol data. */
1373 for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1374 {
1375 bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1376 Elf_Internal_Shdr *symtab_hdr;
1377 Elf_Internal_Sym *isymbuf = NULL;
1378 unsigned int idx;
1379
1380 if (! local_plt_offsets)
1381 continue;
1382
1383 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1384 if (symtab_hdr->sh_info != 0)
1385 {
1386 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1387 if (isymbuf == NULL)
1388 isymbuf = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
1389 symtab_hdr->sh_info, 0,
1390 NULL, NULL, NULL);
1391 if (isymbuf == NULL)
1392 return FALSE;
1393 }
1394
1395 for (idx = 0; idx < symtab_hdr->sh_info; ++idx)
1396 {
1397 Elf_Internal_Sym *isym;
1398 asection *tsec;
1399 bfd_vma address;
1400
1401 if (local_plt_offsets[idx] == (bfd_vma) -1)
1402 continue;
1403
1404 isym = &isymbuf[idx];
1405 if (isym->st_shndx == SHN_UNDEF)
1406 continue;
1407 else if (isym->st_shndx == SHN_ABS)
1408 tsec = bfd_abs_section_ptr;
1409 else if (isym->st_shndx == SHN_COMMON)
1410 tsec = bfd_com_section_ptr;
1411 else
1412 tsec = bfd_section_from_elf_index (ibfd, isym->st_shndx);
1413
1414 address = (tsec->output_section->vma
1415 + tsec->output_offset
1416 + isym->st_value);
1417 if (valid_16bit_address (address))
1418 {
1419 local_plt_offsets[idx] = -1;
1420 splt->size -= 4;
1421 *again = TRUE;
1422 }
1423 }
1424
1425 if (isymbuf != NULL
1426 && symtab_hdr->contents != (unsigned char *) isymbuf)
1427 {
1428 if (! info->keep_memory)
1429 free (isymbuf);
1430 else
1431 {
1432 /* Cache the symbols for elf_link_input_bfd. */
1433 symtab_hdr->contents = (unsigned char *) isymbuf;
1434 }
1435 }
1436 }
1437
1438 /* If we changed anything, walk the symbols again to reallocate
1439 .plt entry addresses. */
1440 if (*again && splt->size > 0)
1441 {
1442 bfd_vma entry = 0;
1443
1444 elf_link_hash_traverse (elf_hash_table (info),
1445 rl78_relax_plt_realloc, &entry);
1446
1447 for (ibfd = info->input_bfds; ibfd ; ibfd = ibfd->link.next)
1448 {
1449 bfd_vma *local_plt_offsets = elf_local_got_offsets (ibfd);
1450 unsigned int nlocals = elf_tdata (ibfd)->symtab_hdr.sh_info;
1451 unsigned int idx;
1452
1453 if (! local_plt_offsets)
1454 continue;
1455
1456 for (idx = 0; idx < nlocals; ++idx)
1457 if (local_plt_offsets[idx] != (bfd_vma) -1)
1458 {
1459 local_plt_offsets[idx] = entry;
1460 entry += 4;
1461 }
1462 }
1463 }
1464
1465 return TRUE;
1466 }
1467
1468 /* Delete some bytes from a section while relaxing. */
1469
1470 static bfd_boolean
1471 elf32_rl78_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count,
1472 Elf_Internal_Rela *alignment_rel, int force_snip)
1473 {
1474 Elf_Internal_Shdr * symtab_hdr;
1475 unsigned int sec_shndx;
1476 bfd_byte * contents;
1477 Elf_Internal_Rela * irel;
1478 Elf_Internal_Rela * irelend;
1479 Elf_Internal_Sym * isym;
1480 Elf_Internal_Sym * isymend;
1481 bfd_vma toaddr;
1482 unsigned int symcount;
1483 struct elf_link_hash_entry ** sym_hashes;
1484 struct elf_link_hash_entry ** end_hashes;
1485
1486 if (!alignment_rel)
1487 force_snip = 1;
1488
1489 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1490
1491 contents = elf_section_data (sec)->this_hdr.contents;
1492
1493 /* The deletion must stop at the next alignment boundary, if
1494 ALIGNMENT_REL is non-NULL. */
1495 toaddr = sec->size;
1496 if (alignment_rel)
1497 toaddr = alignment_rel->r_offset;
1498
1499 irel = elf_section_data (sec)->relocs;
1500 if (irel == NULL)
1501 {
1502 _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL, TRUE);
1503 irel = elf_section_data (sec)->relocs;
1504 }
1505
1506 irelend = irel + sec->reloc_count;
1507
1508 /* Actually delete the bytes. */
1509 memmove (contents + addr, contents + addr + count,
1510 (size_t) (toaddr - addr - count));
1511
1512 /* If we don't have an alignment marker to worry about, we can just
1513 shrink the section. Otherwise, we have to fill in the newly
1514 created gap with NOP insns (0x03). */
1515 if (force_snip)
1516 sec->size -= count;
1517 else
1518 memset (contents + toaddr - count, 0x03, count);
1519
1520 /* Adjust all the relocs. */
1521 for (; irel && irel < irelend; irel++)
1522 {
1523 /* Get the new reloc address. */
1524 if (irel->r_offset > addr
1525 && (irel->r_offset < toaddr
1526 || (force_snip && irel->r_offset == toaddr)))
1527 irel->r_offset -= count;
1528
1529 /* If we see an ALIGN marker at the end of the gap, we move it
1530 to the beginning of the gap, since marking these gaps is what
1531 they're for. */
1532 if (irel->r_offset == toaddr
1533 && ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
1534 && irel->r_addend & RL78_RELAXA_ALIGN)
1535 irel->r_offset -= count;
1536 }
1537
1538 /* Adjust the local symbols defined in this section. */
1539 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1540 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1541 isymend = isym + symtab_hdr->sh_info;
1542
1543 for (; isym < isymend; isym++)
1544 {
1545 /* If the symbol is in the range of memory we just moved, we
1546 have to adjust its value. */
1547 if (isym->st_shndx == sec_shndx
1548 && isym->st_value > addr
1549 && isym->st_value < toaddr)
1550 isym->st_value -= count;
1551
1552 /* If the symbol *spans* the bytes we just deleted (i.e. it's
1553 *end* is in the moved bytes but it's *start* isn't), then we
1554 must adjust its size. */
1555 if (isym->st_shndx == sec_shndx
1556 && isym->st_value < addr
1557 && isym->st_value + isym->st_size > addr
1558 && isym->st_value + isym->st_size < toaddr)
1559 isym->st_size -= count;
1560 }
1561
1562 /* Now adjust the global symbols defined in this section. */
1563 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1564 - symtab_hdr->sh_info);
1565 sym_hashes = elf_sym_hashes (abfd);
1566 end_hashes = sym_hashes + symcount;
1567
1568 for (; sym_hashes < end_hashes; sym_hashes++)
1569 {
1570 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1571
1572 if ((sym_hash->root.type == bfd_link_hash_defined
1573 || sym_hash->root.type == bfd_link_hash_defweak)
1574 && sym_hash->root.u.def.section == sec)
1575 {
1576 /* As above, adjust the value if needed. */
1577 if (sym_hash->root.u.def.value > addr
1578 && sym_hash->root.u.def.value < toaddr)
1579 sym_hash->root.u.def.value -= count;
1580
1581 /* As above, adjust the size if needed. */
1582 if (sym_hash->root.u.def.value < addr
1583 && sym_hash->root.u.def.value + sym_hash->size > addr
1584 && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1585 sym_hash->size -= count;
1586 }
1587 }
1588
1589 return TRUE;
1590 }
1591
1592 /* Used to sort relocs by address. If relocs have the same address,
1593 we maintain their relative order, except that R_RL78_RH_RELAX
1594 alignment relocs must be the first reloc for any given address. */
1595
1596 static void
1597 reloc_bubblesort (Elf_Internal_Rela * r, int count)
1598 {
1599 int i;
1600 bfd_boolean again;
1601 bfd_boolean swappit;
1602
1603 /* This is almost a classic bubblesort. It's the slowest sort, but
1604 we're taking advantage of the fact that the relocations are
1605 mostly in order already (the assembler emits them that way) and
1606 we need relocs with the same address to remain in the same
1607 relative order. */
1608 again = TRUE;
1609 while (again)
1610 {
1611 again = FALSE;
1612 for (i = 0; i < count - 1; i ++)
1613 {
1614 if (r[i].r_offset > r[i + 1].r_offset)
1615 swappit = TRUE;
1616 else if (r[i].r_offset < r[i + 1].r_offset)
1617 swappit = FALSE;
1618 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
1619 && (r[i + 1].r_addend & RL78_RELAXA_ALIGN))
1620 swappit = TRUE;
1621 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RL78_RH_RELAX
1622 && (r[i + 1].r_addend & RL78_RELAXA_ELIGN)
1623 && !(ELF32_R_TYPE (r[i].r_info) == R_RL78_RH_RELAX
1624 && (r[i].r_addend & RL78_RELAXA_ALIGN)))
1625 swappit = TRUE;
1626 else
1627 swappit = FALSE;
1628
1629 if (swappit)
1630 {
1631 Elf_Internal_Rela tmp;
1632
1633 tmp = r[i];
1634 r[i] = r[i + 1];
1635 r[i + 1] = tmp;
1636 /* If we do move a reloc back, re-scan to see if it
1637 needs to be moved even further back. This avoids
1638 most of the O(n^2) behavior for our cases. */
1639 if (i > 0)
1640 i -= 2;
1641 again = TRUE;
1642 }
1643 }
1644 }
1645 }
1646
1647
1648 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
1649 rl78_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1650 lrel, abfd, sec, link_info, scale)
1651
1652 static bfd_vma
1653 rl78_offset_for_reloc (bfd * abfd,
1654 Elf_Internal_Rela * rel,
1655 Elf_Internal_Shdr * symtab_hdr,
1656 Elf_External_Sym_Shndx * shndx_buf ATTRIBUTE_UNUSED,
1657 Elf_Internal_Sym * intsyms,
1658 Elf_Internal_Rela ** lrel,
1659 bfd * input_bfd,
1660 asection * input_section,
1661 struct bfd_link_info * info,
1662 int * scale)
1663 {
1664 bfd_vma symval;
1665 bfd_reloc_status_type r;
1666
1667 *scale = 1;
1668
1669 /* REL is the first of 1..N relocations. We compute the symbol
1670 value for each relocation, then combine them if needed. LREL
1671 gets a pointer to the last relocation used. */
1672 while (1)
1673 {
1674 int32_t tmp1, tmp2;
1675
1676 /* Get the value of the symbol referred to by the reloc. */
1677 if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1678 {
1679 /* A local symbol. */
1680 Elf_Internal_Sym *isym;
1681 asection *ssec;
1682
1683 isym = intsyms + ELF32_R_SYM (rel->r_info);
1684
1685 if (isym->st_shndx == SHN_UNDEF)
1686 ssec = bfd_und_section_ptr;
1687 else if (isym->st_shndx == SHN_ABS)
1688 ssec = bfd_abs_section_ptr;
1689 else if (isym->st_shndx == SHN_COMMON)
1690 ssec = bfd_com_section_ptr;
1691 else
1692 ssec = bfd_section_from_elf_index (abfd,
1693 isym->st_shndx);
1694
1695 /* Initial symbol value. */
1696 symval = isym->st_value;
1697
1698 /* GAS may have made this symbol relative to a section, in
1699 which case, we have to add the addend to find the
1700 symbol. */
1701 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
1702 symval += rel->r_addend;
1703
1704 if (ssec)
1705 {
1706 if ((ssec->flags & SEC_MERGE)
1707 && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
1708 symval = _bfd_merged_section_offset (abfd, & ssec,
1709 elf_section_data (ssec)->sec_info,
1710 symval);
1711 }
1712
1713 /* Now make the offset relative to where the linker is putting it. */
1714 if (ssec)
1715 symval +=
1716 ssec->output_section->vma + ssec->output_offset;
1717
1718 symval += rel->r_addend;
1719 }
1720 else
1721 {
1722 unsigned long indx;
1723 struct elf_link_hash_entry * h;
1724
1725 /* An external symbol. */
1726 indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1727 h = elf_sym_hashes (abfd)[indx];
1728 BFD_ASSERT (h != NULL);
1729
1730 if (h->root.type != bfd_link_hash_defined
1731 && h->root.type != bfd_link_hash_defweak)
1732 {
1733 /* This appears to be a reference to an undefined
1734 symbol. Just ignore it--it will be caught by the
1735 regular reloc processing. */
1736 if (lrel)
1737 *lrel = rel;
1738 return 0;
1739 }
1740
1741 symval = (h->root.u.def.value
1742 + h->root.u.def.section->output_section->vma
1743 + h->root.u.def.section->output_offset);
1744
1745 symval += rel->r_addend;
1746 }
1747
1748 switch (ELF32_R_TYPE (rel->r_info))
1749 {
1750 case R_RL78_SYM:
1751 RL78_STACK_PUSH (symval);
1752 break;
1753
1754 case R_RL78_OPneg:
1755 RL78_STACK_POP (tmp1);
1756 tmp1 = - tmp1;
1757 RL78_STACK_PUSH (tmp1);
1758 break;
1759
1760 case R_RL78_OPadd:
1761 RL78_STACK_POP (tmp1);
1762 RL78_STACK_POP (tmp2);
1763 tmp1 += tmp2;
1764 RL78_STACK_PUSH (tmp1);
1765 break;
1766
1767 case R_RL78_OPsub:
1768 RL78_STACK_POP (tmp1);
1769 RL78_STACK_POP (tmp2);
1770 tmp2 -= tmp1;
1771 RL78_STACK_PUSH (tmp2);
1772 break;
1773
1774 case R_RL78_OPmul:
1775 RL78_STACK_POP (tmp1);
1776 RL78_STACK_POP (tmp2);
1777 tmp1 *= tmp2;
1778 RL78_STACK_PUSH (tmp1);
1779 break;
1780
1781 case R_RL78_OPdiv:
1782 RL78_STACK_POP (tmp1);
1783 RL78_STACK_POP (tmp2);
1784 tmp1 /= tmp2;
1785 RL78_STACK_PUSH (tmp1);
1786 break;
1787
1788 case R_RL78_OPshla:
1789 RL78_STACK_POP (tmp1);
1790 RL78_STACK_POP (tmp2);
1791 tmp1 <<= tmp2;
1792 RL78_STACK_PUSH (tmp1);
1793 break;
1794
1795 case R_RL78_OPshra:
1796 RL78_STACK_POP (tmp1);
1797 RL78_STACK_POP (tmp2);
1798 tmp1 >>= tmp2;
1799 RL78_STACK_PUSH (tmp1);
1800 break;
1801
1802 case R_RL78_OPsctsize:
1803 RL78_STACK_PUSH (input_section->size);
1804 break;
1805
1806 case R_RL78_OPscttop:
1807 RL78_STACK_PUSH (input_section->output_section->vma);
1808 break;
1809
1810 case R_RL78_OPand:
1811 RL78_STACK_POP (tmp1);
1812 RL78_STACK_POP (tmp2);
1813 tmp1 &= tmp2;
1814 RL78_STACK_PUSH (tmp1);
1815 break;
1816
1817 case R_RL78_OPor:
1818 RL78_STACK_POP (tmp1);
1819 RL78_STACK_POP (tmp2);
1820 tmp1 |= tmp2;
1821 RL78_STACK_PUSH (tmp1);
1822 break;
1823
1824 case R_RL78_OPxor:
1825 RL78_STACK_POP (tmp1);
1826 RL78_STACK_POP (tmp2);
1827 tmp1 ^= tmp2;
1828 RL78_STACK_PUSH (tmp1);
1829 break;
1830
1831 case R_RL78_OPnot:
1832 RL78_STACK_POP (tmp1);
1833 tmp1 = ~ tmp1;
1834 RL78_STACK_PUSH (tmp1);
1835 break;
1836
1837 case R_RL78_OPmod:
1838 RL78_STACK_POP (tmp1);
1839 RL78_STACK_POP (tmp2);
1840 tmp1 %= tmp2;
1841 RL78_STACK_PUSH (tmp1);
1842 break;
1843
1844 case R_RL78_OPromtop:
1845 RL78_STACK_PUSH (get_romstart (&r, info, input_bfd, input_section, rel->r_offset));
1846 break;
1847
1848 case R_RL78_OPramtop:
1849 RL78_STACK_PUSH (get_ramstart (&r, info, input_bfd, input_section, rel->r_offset));
1850 break;
1851
1852 case R_RL78_DIR16UL:
1853 case R_RL78_DIR8UL:
1854 case R_RL78_ABS16UL:
1855 case R_RL78_ABS8UL:
1856 if (rl78_stack_top)
1857 RL78_STACK_POP (symval);
1858 if (lrel)
1859 *lrel = rel;
1860 *scale = 4;
1861 return symval;
1862
1863 case R_RL78_DIR16UW:
1864 case R_RL78_DIR8UW:
1865 case R_RL78_ABS16UW:
1866 case R_RL78_ABS8UW:
1867 if (rl78_stack_top)
1868 RL78_STACK_POP (symval);
1869 if (lrel)
1870 *lrel = rel;
1871 *scale = 2;
1872 return symval;
1873
1874 default:
1875 if (rl78_stack_top)
1876 RL78_STACK_POP (symval);
1877 if (lrel)
1878 *lrel = rel;
1879 return symval;
1880 }
1881
1882 rel ++;
1883 }
1884 }
1885
1886 struct {
1887 int prefix; /* or -1 for "no prefix" */
1888 int insn; /* or -1 for "end of list" */
1889 int insn_for_saddr; /* or -1 for "no alternative" */
1890 int insn_for_sfr; /* or -1 for "no alternative" */
1891 } relax_addr16[] = {
1892 { -1, 0x02, 0x06, -1 }, /* ADDW AX, !addr16 */
1893 { -1, 0x22, 0x26, -1 }, /* SUBW AX, !addr16 */
1894 { -1, 0x42, 0x46, -1 }, /* CMPW AX, !addr16 */
1895 { -1, 0x40, 0x4a, -1 }, /* CMP !addr16, #byte */
1896
1897 { -1, 0x0f, 0x0b, -1 }, /* ADD A, !addr16 */
1898 { -1, 0x1f, 0x1b, -1 }, /* ADDC A, !addr16 */
1899 { -1, 0x2f, 0x2b, -1 }, /* SUB A, !addr16 */
1900 { -1, 0x3f, 0x3b, -1 }, /* SUBC A, !addr16 */
1901 { -1, 0x4f, 0x4b, -1 }, /* CMP A, !addr16 */
1902 { -1, 0x5f, 0x5b, -1 }, /* AND A, !addr16 */
1903 { -1, 0x6f, 0x6b, -1 }, /* OR A, !addr16 */
1904 { -1, 0x7f, 0x7b, -1 }, /* XOR A, !addr16 */
1905
1906 { -1, 0x8f, 0x8d, 0x8e }, /* MOV A, !addr16 */
1907 { -1, 0x9f, 0x9d, 0x9e }, /* MOV !addr16, A */
1908 { -1, 0xaf, 0xad, 0xae }, /* MOVW AX, !addr16 */
1909 { -1, 0xbf, 0xbd, 0xbe }, /* MOVW !addr16, AX */
1910 { -1, 0xcf, 0xcd, 0xce }, /* MOVW !addr16, #word */
1911
1912 { -1, 0xa0, 0xa4, -1 }, /* INC !addr16 */
1913 { -1, 0xa2, 0xa6, -1 }, /* INCW !addr16 */
1914 { -1, 0xb0, 0xb4, -1 }, /* DEC !addr16 */
1915 { -1, 0xb2, 0xb6, -1 }, /* DECW !addr16 */
1916
1917 { -1, 0xd5, 0xd4, -1 }, /* CMP0 !addr16 */
1918 { -1, 0xe5, 0xe4, -1 }, /* ONEB !addr16 */
1919 { -1, 0xf5, 0xf4, -1 }, /* CLRB !addr16 */
1920
1921 { -1, 0xd9, 0xd8, -1 }, /* MOV X, !addr16 */
1922 { -1, 0xe9, 0xe8, -1 }, /* MOV B, !addr16 */
1923 { -1, 0xf9, 0xf8, -1 }, /* MOV C, !addr16 */
1924 { -1, 0xdb, 0xda, -1 }, /* MOVW BC, !addr16 */
1925 { -1, 0xeb, 0xea, -1 }, /* MOVW DE, !addr16 */
1926 { -1, 0xfb, 0xfa, -1 }, /* MOVW HL, !addr16 */
1927
1928 { 0x61, 0xaa, 0xa8, -1 }, /* XCH A, !addr16 */
1929
1930 { 0x71, 0x00, 0x02, 0x0a }, /* SET1 !addr16.0 */
1931 { 0x71, 0x10, 0x12, 0x1a }, /* SET1 !addr16.0 */
1932 { 0x71, 0x20, 0x22, 0x2a }, /* SET1 !addr16.0 */
1933 { 0x71, 0x30, 0x32, 0x3a }, /* SET1 !addr16.0 */
1934 { 0x71, 0x40, 0x42, 0x4a }, /* SET1 !addr16.0 */
1935 { 0x71, 0x50, 0x52, 0x5a }, /* SET1 !addr16.0 */
1936 { 0x71, 0x60, 0x62, 0x6a }, /* SET1 !addr16.0 */
1937 { 0x71, 0x70, 0x72, 0x7a }, /* SET1 !addr16.0 */
1938
1939 { 0x71, 0x08, 0x03, 0x0b }, /* CLR1 !addr16.0 */
1940 { 0x71, 0x18, 0x13, 0x1b }, /* CLR1 !addr16.0 */
1941 { 0x71, 0x28, 0x23, 0x2b }, /* CLR1 !addr16.0 */
1942 { 0x71, 0x38, 0x33, 0x3b }, /* CLR1 !addr16.0 */
1943 { 0x71, 0x48, 0x43, 0x4b }, /* CLR1 !addr16.0 */
1944 { 0x71, 0x58, 0x53, 0x5b }, /* CLR1 !addr16.0 */
1945 { 0x71, 0x68, 0x63, 0x6b }, /* CLR1 !addr16.0 */
1946 { 0x71, 0x78, 0x73, 0x7b }, /* CLR1 !addr16.0 */
1947
1948 { -1, -1, -1, -1 }
1949 };
1950
1951 /* Relax one section. */
1952
1953 static bfd_boolean
1954 rl78_elf_relax_section
1955 (bfd * abfd,
1956 asection * sec,
1957 struct bfd_link_info * link_info,
1958 bfd_boolean * again)
1959 {
1960 Elf_Internal_Shdr * symtab_hdr;
1961 Elf_Internal_Shdr * shndx_hdr;
1962 Elf_Internal_Rela * internal_relocs;
1963 Elf_Internal_Rela * free_relocs = NULL;
1964 Elf_Internal_Rela * irel;
1965 Elf_Internal_Rela * srel;
1966 Elf_Internal_Rela * irelend;
1967 Elf_Internal_Rela * next_alignment;
1968 bfd_byte * contents = NULL;
1969 bfd_byte * free_contents = NULL;
1970 Elf_Internal_Sym * intsyms = NULL;
1971 Elf_Internal_Sym * free_intsyms = NULL;
1972 Elf_External_Sym_Shndx * shndx_buf = NULL;
1973 bfd_vma pc;
1974 bfd_vma symval ATTRIBUTE_UNUSED = 0;
1975 int pcrel ATTRIBUTE_UNUSED = 0;
1976 int code ATTRIBUTE_UNUSED = 0;
1977 int section_alignment_glue;
1978 int scale;
1979
1980 if (abfd == elf_hash_table (link_info)->dynobj
1981 && strcmp (sec->name, ".plt") == 0)
1982 return rl78_elf_relax_plt_section (abfd, sec, link_info, again);
1983
1984 /* Assume nothing changes. */
1985 *again = FALSE;
1986
1987 /* We don't have to do anything for a relocatable link, if
1988 this section does not have relocs, or if this is not a
1989 code section. */
1990 if (link_info->relocatable
1991 || (sec->flags & SEC_RELOC) == 0
1992 || sec->reloc_count == 0
1993 || (sec->flags & SEC_CODE) == 0)
1994 return TRUE;
1995
1996 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1997 shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
1998
1999 /* Get the section contents. */
2000 if (elf_section_data (sec)->this_hdr.contents != NULL)
2001 contents = elf_section_data (sec)->this_hdr.contents;
2002 /* Go get them off disk. */
2003 else
2004 {
2005 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2006 goto error_return;
2007 elf_section_data (sec)->this_hdr.contents = contents;
2008 }
2009
2010 /* Read this BFD's symbols. */
2011 /* Get cached copy if it exists. */
2012 if (symtab_hdr->contents != NULL)
2013 intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
2014 else
2015 {
2016 intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
2017 symtab_hdr->contents = (bfd_byte *) intsyms;
2018 }
2019
2020 if (shndx_hdr->sh_size != 0)
2021 {
2022 bfd_size_type amt;
2023
2024 amt = symtab_hdr->sh_info;
2025 amt *= sizeof (Elf_External_Sym_Shndx);
2026 shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
2027 if (shndx_buf == NULL)
2028 goto error_return;
2029 if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
2030 || bfd_bread (shndx_buf, amt, abfd) != amt)
2031 goto error_return;
2032 shndx_hdr->contents = (bfd_byte *) shndx_buf;
2033 }
2034
2035 /* Get a copy of the native relocations. */
2036 internal_relocs = (_bfd_elf_link_read_relocs
2037 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2038 link_info->keep_memory));
2039 if (internal_relocs == NULL)
2040 goto error_return;
2041 if (! link_info->keep_memory)
2042 free_relocs = internal_relocs;
2043
2044 /* The RL_ relocs must be just before the operand relocs they go
2045 with, so we must sort them to guarantee this. We use bubblesort
2046 instead of qsort so we can guarantee that relocs with the same
2047 address remain in the same relative order. */
2048 reloc_bubblesort (internal_relocs, sec->reloc_count);
2049
2050 /* Walk through them looking for relaxing opportunities. */
2051 irelend = internal_relocs + sec->reloc_count;
2052
2053
2054 /* This will either be NULL or a pointer to the next alignment
2055 relocation. */
2056 next_alignment = internal_relocs;
2057
2058 /* We calculate worst case shrinkage caused by alignment directives.
2059 No fool-proof, but better than either ignoring the problem or
2060 doing heavy duty analysis of all the alignment markers in all
2061 input sections. */
2062 section_alignment_glue = 0;
2063 for (irel = internal_relocs; irel < irelend; irel++)
2064 if (ELF32_R_TYPE (irel->r_info) == R_RL78_RH_RELAX
2065 && irel->r_addend & RL78_RELAXA_ALIGN)
2066 {
2067 int this_glue = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
2068
2069 if (section_alignment_glue < this_glue)
2070 section_alignment_glue = this_glue;
2071 }
2072 /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
2073 shrinkage. */
2074 section_alignment_glue *= 2;
2075
2076 for (irel = internal_relocs; irel < irelend; irel++)
2077 {
2078 unsigned char *insn;
2079 int nrelocs;
2080
2081 /* The insns we care about are all marked with one of these. */
2082 if (ELF32_R_TYPE (irel->r_info) != R_RL78_RH_RELAX)
2083 continue;
2084
2085 if (irel->r_addend & RL78_RELAXA_ALIGN
2086 || next_alignment == internal_relocs)
2087 {
2088 /* When we delete bytes, we need to maintain all the alignments
2089 indicated. In addition, we need to be careful about relaxing
2090 jumps across alignment boundaries - these displacements
2091 *grow* when we delete bytes. For now, don't shrink
2092 displacements across an alignment boundary, just in case.
2093 Note that this only affects relocations to the same
2094 section. */
2095 next_alignment += 2;
2096 while (next_alignment < irelend
2097 && (ELF32_R_TYPE (next_alignment->r_info) != R_RL78_RH_RELAX
2098 || !(next_alignment->r_addend & RL78_RELAXA_ELIGN)))
2099 next_alignment ++;
2100 if (next_alignment >= irelend || next_alignment->r_offset == 0)
2101 next_alignment = NULL;
2102 }
2103
2104 /* When we hit alignment markers, see if we've shrunk enough
2105 before them to reduce the gap without violating the alignment
2106 requirements. */
2107 if (irel->r_addend & RL78_RELAXA_ALIGN)
2108 {
2109 /* At this point, the next relocation *should* be the ELIGN
2110 end marker. */
2111 Elf_Internal_Rela *erel = irel + 1;
2112 unsigned int alignment, nbytes;
2113
2114 if (ELF32_R_TYPE (erel->r_info) != R_RL78_RH_RELAX)
2115 continue;
2116 if (!(erel->r_addend & RL78_RELAXA_ELIGN))
2117 continue;
2118
2119 alignment = 1 << (irel->r_addend & RL78_RELAXA_ANUM);
2120
2121 if (erel->r_offset - irel->r_offset < alignment)
2122 continue;
2123
2124 nbytes = erel->r_offset - irel->r_offset;
2125 nbytes /= alignment;
2126 nbytes *= alignment;
2127
2128 elf32_rl78_relax_delete_bytes (abfd, sec, erel->r_offset-nbytes, nbytes, next_alignment,
2129 erel->r_offset == sec->size);
2130 *again = TRUE;
2131
2132 continue;
2133 }
2134
2135 if (irel->r_addend & RL78_RELAXA_ELIGN)
2136 continue;
2137
2138 insn = contents + irel->r_offset;
2139
2140 nrelocs = irel->r_addend & RL78_RELAXA_RNUM;
2141
2142 /* At this point, we have an insn that is a candidate for linker
2143 relaxation. There are NRELOCS relocs following that may be
2144 relaxed, although each reloc may be made of more than one
2145 reloc entry (such as gp-rel symbols). */
2146
2147 /* Get the value of the symbol referred to by the reloc. Just
2148 in case this is the last reloc in the list, use the RL's
2149 addend to choose between this reloc (no addend) or the next
2150 (yes addend, which means at least one following reloc). */
2151
2152 /* srel points to the "current" reloction for this insn -
2153 actually the last reloc for a given operand, which is the one
2154 we need to update. We check the relaxations in the same
2155 order that the relocations happen, so we'll just push it
2156 along as we go. */
2157 srel = irel;
2158
2159 pc = sec->output_section->vma + sec->output_offset
2160 + srel->r_offset;
2161
2162 #define GET_RELOC \
2163 BFD_ASSERT (nrelocs > 0); \
2164 symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \
2165 pcrel = symval - pc + srel->r_addend; \
2166 nrelocs --;
2167
2168 #define SNIPNR(offset, nbytes) \
2169 elf32_rl78_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0);
2170 #define SNIP(offset, nbytes, newtype) \
2171 SNIPNR (offset, nbytes); \
2172 srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2173
2174 /* The order of these bit tests must match the order that the
2175 relocs appear in. Since we sorted those by offset, we can
2176 predict them. */
2177
2178 /*----------------------------------------------------------------------*/
2179 /* EF ad BR $rel8 pcrel
2180 ED al ah BR !abs16 abs
2181 EE al ah BR $!rel16 pcrel
2182 EC al ah as BR !!abs20 abs
2183
2184 FD al ah CALL !abs16 abs
2185 FE al ah CALL $!rel16 pcrel
2186 FC al ah as CALL !!abs20 abs
2187
2188 DC ad BC $rel8
2189 DE ad BNC $rel8
2190 DD ad BZ $rel8
2191 DF ad BNZ $rel8
2192 61 C3 ad BH $rel8
2193 61 D3 ad BNH $rel8
2194 61 C8 EF ad SKC ; BR $rel8
2195 61 D8 EF ad SKNC ; BR $rel8
2196 61 E8 EF ad SKZ ; BR $rel8
2197 61 F8 EF ad SKNZ ; BR $rel8
2198 61 E3 EF ad SKH ; BR $rel8
2199 61 F3 EF ad SKNH ; BR $rel8
2200 */
2201
2202 if (irel->r_addend & RL78_RELAXA_BRA)
2203 {
2204 /* SKIP opcodes that skip non-branches will have a relax tag
2205 but no corresponding symbol to relax against; we just
2206 skip those. */
2207 if (irel->r_addend & RL78_RELAXA_RNUM)
2208 {
2209 GET_RELOC;
2210 }
2211
2212 switch (insn[0])
2213 {
2214 case 0xec: /* BR !!abs20 */
2215
2216 if (pcrel < 127
2217 && pcrel > -127)
2218 {
2219 insn[0] = 0xef;
2220 insn[1] = pcrel;
2221 SNIP (2, 2, R_RL78_DIR8S_PCREL);
2222 *again = TRUE;
2223 }
2224 else if (symval < 65536)
2225 {
2226 insn[0] = 0xed;
2227 insn[1] = symval & 0xff;
2228 insn[2] = symval >> 8;
2229 SNIP (2, 1, R_RL78_DIR16S);
2230 *again = TRUE;
2231 }
2232 else if (pcrel < 32767
2233 && pcrel > -32767)
2234 {
2235 insn[0] = 0xee;
2236 insn[1] = pcrel & 0xff;
2237 insn[2] = pcrel >> 8;
2238 SNIP (2, 1, R_RL78_DIR16S_PCREL);
2239 *again = TRUE;
2240 }
2241 break;
2242
2243 case 0xee: /* BR $!pcrel16 */
2244 case 0xed: /* BR $!abs16 */
2245 if (pcrel < 127
2246 && pcrel > -127)
2247 {
2248 insn[0] = 0xef;
2249 insn[1] = pcrel;
2250 SNIP (2, 1, R_RL78_DIR8S_PCREL);
2251 *again = TRUE;
2252 }
2253 break;
2254
2255 case 0xfc: /* CALL !!abs20 */
2256 if (symval < 65536)
2257 {
2258 insn[0] = 0xfd;
2259 insn[1] = symval & 0xff;
2260 insn[2] = symval >> 8;
2261 SNIP (2, 1, R_RL78_DIR16S);
2262 *again = TRUE;
2263 }
2264 else if (pcrel < 32767
2265 && pcrel > -32767)
2266 {
2267 insn[0] = 0xfe;
2268 insn[1] = pcrel & 0xff;
2269 insn[2] = pcrel >> 8;
2270 SNIP (2, 1, R_RL78_DIR16S_PCREL);
2271 *again = TRUE;
2272 }
2273 break;
2274
2275 case 0x61: /* PREFIX */
2276 /* For SKIP/BR, we change the BR opcode and delete the
2277 SKIP. That way, we don't have to find and change the
2278 relocation for the BR. */
2279 /* Note that, for the case where we're skipping some
2280 other insn, we have no "other" reloc but that's safe
2281 here anyway. */
2282 switch (insn[1])
2283 {
2284 case 0xc8: /* SKC */
2285 if (insn[2] == 0xef)
2286 {
2287 insn[2] = 0xde; /* BNC */
2288 SNIPNR (0, 2);
2289 }
2290 break;
2291
2292 case 0xd8: /* SKNC */
2293 if (insn[2] == 0xef)
2294 {
2295 insn[2] = 0xdc; /* BC */
2296 SNIPNR (0, 2);
2297 }
2298 break;
2299
2300 case 0xe8: /* SKZ */
2301 if (insn[2] == 0xef)
2302 {
2303 insn[2] = 0xdf; /* BNZ */
2304 SNIPNR (0, 2);
2305 }
2306 break;
2307
2308 case 0xf8: /* SKNZ */
2309 if (insn[2] == 0xef)
2310 {
2311 insn[2] = 0xdd; /* BZ */
2312 SNIPNR (0, 2);
2313 }
2314 break;
2315
2316 case 0xe3: /* SKH */
2317 if (insn[2] == 0xef)
2318 {
2319 insn[2] = 0xd3; /* BNH */
2320 SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2321 }
2322 break;
2323
2324 case 0xf3: /* SKNH */
2325 if (insn[2] == 0xef)
2326 {
2327 insn[2] = 0xc3; /* BH */
2328 SNIPNR (1, 1); /* we reuse the 0x61 prefix from the SKH */
2329 }
2330 break;
2331 }
2332 break;
2333 }
2334
2335 }
2336
2337 if (irel->r_addend & RL78_RELAXA_ADDR16)
2338 {
2339 /*----------------------------------------------------------------------*/
2340 /* Some insns have both a 16-bit address operand and an 8-bit
2341 variant if the address is within a special range:
2342
2343 Address 16-bit operand SADDR range SFR range
2344 FFF00-FFFFF 0xff00-0xffff 0x00-0xff
2345 FFE20-FFF1F 0xfe20-0xff1f 0x00-0xff
2346
2347 The RELAX_ADDR16[] array has the insn encodings for the
2348 16-bit operand version, as well as the SFR and SADDR
2349 variants. We only need to replace the encodings and
2350 adjust the operand.
2351
2352 Note: we intentionally do not attempt to decode and skip
2353 any ES: prefix, as adding ES: means the addr16 (likely)
2354 no longer points to saddr/sfr space.
2355 */
2356
2357 int is_sfr;
2358 int is_saddr;
2359 int idx;
2360 int poff;
2361
2362 GET_RELOC;
2363
2364 if (0xffe20 <= symval && symval <= 0xfffff)
2365 {
2366
2367 is_saddr = (0xffe20 <= symval && symval <= 0xfff1f);
2368 is_sfr = (0xfff00 <= symval && symval <= 0xfffff);
2369
2370 for (idx = 0; relax_addr16[idx].insn != -1; idx ++)
2371 {
2372 if (relax_addr16[idx].prefix != -1
2373 && insn[0] == relax_addr16[idx].prefix
2374 && insn[1] == relax_addr16[idx].insn)
2375 {
2376 poff = 1;
2377 }
2378 else if (relax_addr16[idx].prefix == -1
2379 && insn[0] == relax_addr16[idx].insn)
2380 {
2381 poff = 0;
2382 }
2383 else
2384 continue;
2385
2386 /* We have a matched insn, and poff is 0 or 1 depending
2387 on the base pattern size. */
2388
2389 if (is_sfr && relax_addr16[idx].insn_for_sfr != -1)
2390 {
2391 insn[poff] = relax_addr16[idx].insn_for_sfr;
2392 SNIP (poff+2, 1, R_RL78_RH_SFR);
2393 }
2394
2395 else if (is_saddr && relax_addr16[idx].insn_for_saddr != -1)
2396 {
2397 insn[poff] = relax_addr16[idx].insn_for_saddr;
2398 SNIP (poff+2, 1, R_RL78_RH_SADDR);
2399 }
2400
2401 }
2402 }
2403 }
2404
2405 /*----------------------------------------------------------------------*/
2406
2407 }
2408
2409 return TRUE;
2410
2411 error_return:
2412 if (free_relocs != NULL)
2413 free (free_relocs);
2414
2415 if (free_contents != NULL)
2416 free (free_contents);
2417
2418 if (shndx_buf != NULL)
2419 {
2420 shndx_hdr->contents = NULL;
2421 free (shndx_buf);
2422 }
2423
2424 if (free_intsyms != NULL)
2425 free (free_intsyms);
2426
2427 return TRUE;
2428 }
2429
2430 \f
2431
2432 #define ELF_ARCH bfd_arch_rl78
2433 #define ELF_MACHINE_CODE EM_RL78
2434 #define ELF_MAXPAGESIZE 0x1000
2435
2436 #define TARGET_LITTLE_SYM rl78_elf32_vec
2437 #define TARGET_LITTLE_NAME "elf32-rl78"
2438
2439 #define elf_info_to_howto_rel NULL
2440 #define elf_info_to_howto rl78_info_to_howto_rela
2441 #define elf_backend_object_p rl78_elf_object_p
2442 #define elf_backend_relocate_section rl78_elf_relocate_section
2443 #define elf_symbol_leading_char ('_')
2444 #define elf_backend_can_gc_sections 1
2445
2446 #define bfd_elf32_bfd_reloc_type_lookup rl78_reloc_type_lookup
2447 #define bfd_elf32_bfd_reloc_name_lookup rl78_reloc_name_lookup
2448 #define bfd_elf32_bfd_set_private_flags rl78_elf_set_private_flags
2449 #define bfd_elf32_bfd_merge_private_bfd_data rl78_elf_merge_private_bfd_data
2450 #define bfd_elf32_bfd_print_private_bfd_data rl78_elf_print_private_bfd_data
2451
2452 #define bfd_elf32_bfd_relax_section rl78_elf_relax_section
2453 #define elf_backend_check_relocs rl78_elf_check_relocs
2454 #define elf_backend_always_size_sections \
2455 rl78_elf_always_size_sections
2456 #define elf_backend_finish_dynamic_sections \
2457 rl78_elf_finish_dynamic_sections
2458
2459 #include "elf32-target.h"
This page took 0.089347 seconds and 5 git commands to generate.