]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - bfd/elf32-ip2k.c
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / bfd / elf32-ip2k.c
1 /* Ubicom IP2xxx specific support for 32-bit ELF
2 Copyright (C) 2000-2024 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21 #include "sysdep.h"
22 #include "bfd.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/ip2k.h"
26
27 /* Struct used to pass miscellaneous paramaters which
28 helps to avoid overly long parameter lists. */
29 struct misc
30 {
31 Elf_Internal_Shdr * symtab_hdr;
32 Elf_Internal_Rela * irelbase;
33 bfd_byte * contents;
34 Elf_Internal_Sym * isymbuf;
35 };
36
37 struct ip2k_opcode
38 {
39 unsigned short opcode;
40 unsigned short mask;
41 };
42
43 static bool ip2k_relaxed = false;
44
45 static const struct ip2k_opcode ip2k_page_opcode[] =
46 {
47 {0x0010, 0xFFF8}, /* Page. */
48 {0x0000, 0x0000},
49 };
50
51 #define IS_PAGE_OPCODE(code) \
52 ip2k_is_opcode (code, ip2k_page_opcode)
53
54 static const struct ip2k_opcode ip2k_jmp_opcode[] =
55 {
56 {0xE000, 0xE000}, /* Jmp. */
57 {0x0000, 0x0000},
58 };
59
60 #define IS_JMP_OPCODE(code) \
61 ip2k_is_opcode (code, ip2k_jmp_opcode)
62
63 static const struct ip2k_opcode ip2k_snc_opcode[] =
64 {
65 {0xA00B, 0xFFFF}, /* Snc. */
66 {0x0000, 0x0000},
67 };
68
69 #define IS_SNC_OPCODE(code) \
70 ip2k_is_opcode (code, ip2k_snc_opcode)
71
72 static const struct ip2k_opcode ip2k_inc_1sp_opcode[] =
73 {
74 {0x2B81, 0xFFFF}, /* Inc 1(SP). */
75 {0x0000, 0x0000},
76 };
77
78 #define IS_INC_1SP_OPCODE(code) \
79 ip2k_is_opcode (code, ip2k_inc_1sp_opcode)
80
81 static const struct ip2k_opcode ip2k_add_2sp_w_opcode[] =
82 {
83 {0x1F82, 0xFFFF}, /* Add 2(SP),w. */
84 {0x0000, 0x0000},
85 };
86
87 #define IS_ADD_2SP_W_OPCODE(code) \
88 ip2k_is_opcode (code, ip2k_add_2sp_w_opcode)
89
90 static const struct ip2k_opcode ip2k_add_w_wreg_opcode[] =
91 {
92 {0x1C0A, 0xFFFF}, /* Add w,wreg. */
93 {0x1E0A, 0xFFFF}, /* Add wreg,w. */
94 {0x0000, 0x0000},
95 };
96
97 #define IS_ADD_W_WREG_OPCODE(code) \
98 ip2k_is_opcode (code, ip2k_add_w_wreg_opcode)
99
100 static const struct ip2k_opcode ip2k_add_pcl_w_opcode[] =
101 {
102 {0x1E09, 0xFFFF}, /* Add pcl,w. */
103 {0x0000, 0x0000},
104 };
105
106 #define IS_ADD_PCL_W_OPCODE(code) \
107 ip2k_is_opcode (code, ip2k_add_pcl_w_opcode)
108
109 static const struct ip2k_opcode ip2k_skip_opcodes[] =
110 {
111 {0xB000, 0xF000}, /* sb */
112 {0xA000, 0xF000}, /* snb */
113 {0x7600, 0xFE00}, /* cse/csne #lit */
114 {0x5800, 0xFC00}, /* incsnz */
115 {0x4C00, 0xFC00}, /* decsnz */
116 {0x4000, 0xFC00}, /* cse/csne */
117 {0x3C00, 0xFC00}, /* incsz */
118 {0x2C00, 0xFC00}, /* decsz */
119 {0x0000, 0x0000},
120 };
121
122 #define IS_SKIP_OPCODE(code) \
123 ip2k_is_opcode (code, ip2k_skip_opcodes)
124
125 /* Relocation tables. */
126 static reloc_howto_type ip2k_elf_howto_table [] =
127 {
128 #define IP2K_HOWTO(t,rs,s,bs,pr,bp,name,sm,dm) \
129 HOWTO(t, /* type */ \
130 rs, /* rightshift */ \
131 s, /* size (0 = byte, 1 = short, 2 = long) */ \
132 bs, /* bitsize */ \
133 pr, /* pc_relative */ \
134 bp, /* bitpos */ \
135 complain_overflow_dont,/* complain_on_overflow */ \
136 bfd_elf_generic_reloc,/* special_function */ \
137 name, /* name */ \
138 false, /* partial_inplace */ \
139 sm, /* src_mask */ \
140 dm, /* dst_mask */ \
141 pr) /* pcrel_offset */
142
143 /* This reloc does nothing. */
144 IP2K_HOWTO (R_IP2K_NONE, 0,0,0, false, 0, "R_IP2K_NONE", 0, 0),
145 /* A 16 bit absolute relocation. */
146 IP2K_HOWTO (R_IP2K_16, 0,2,16, false, 0, "R_IP2K_16", 0, 0xffff),
147 /* A 32 bit absolute relocation. */
148 IP2K_HOWTO (R_IP2K_32, 0,4,32, false, 0, "R_IP2K_32", 0, 0xffffffff),
149 /* A 8-bit data relocation for the FR9 field. Ninth bit is computed specially. */
150 IP2K_HOWTO (R_IP2K_FR9, 0,2,9, false, 0, "R_IP2K_FR9", 0, 0x00ff),
151 /* A 4-bit data relocation. */
152 IP2K_HOWTO (R_IP2K_BANK, 8,2,4, false, 0, "R_IP2K_BANK", 0, 0x000f),
153 /* A 13-bit insn relocation - word address => right-shift 1 bit extra. */
154 IP2K_HOWTO (R_IP2K_ADDR16CJP, 1,2,13, false, 0, "R_IP2K_ADDR16CJP", 0, 0x1fff),
155 /* A 3-bit insn relocation - word address => right-shift 1 bit extra. */
156 IP2K_HOWTO (R_IP2K_PAGE3, 14,2,3, false, 0, "R_IP2K_PAGE3", 0, 0x0007),
157 /* Two 8-bit data relocations. */
158 IP2K_HOWTO (R_IP2K_LO8DATA, 0,2,8, false, 0, "R_IP2K_LO8DATA", 0, 0x00ff),
159 IP2K_HOWTO (R_IP2K_HI8DATA, 8,2,8, false, 0, "R_IP2K_HI8DATA", 0, 0x00ff),
160 /* Two 8-bit insn relocations. word address => right-shift 1 bit extra. */
161 IP2K_HOWTO (R_IP2K_LO8INSN, 1,2,8, false, 0, "R_IP2K_LO8INSN", 0, 0x00ff),
162 IP2K_HOWTO (R_IP2K_HI8INSN, 9,2,8, false, 0, "R_IP2K_HI8INSN", 0, 0x00ff),
163
164 /* Special 1 bit relocation for SKIP instructions. */
165 IP2K_HOWTO (R_IP2K_PC_SKIP, 1,2,1, false, 12, "R_IP2K_PC_SKIP", 0xfffe, 0x1000),
166 /* 16 bit word address. */
167 IP2K_HOWTO (R_IP2K_TEXT, 1,2,16, false, 0, "R_IP2K_TEXT", 0, 0xffff),
168 /* A 7-bit offset relocation for the FR9 field. Eigth and ninth bit comes from insn. */
169 IP2K_HOWTO (R_IP2K_FR_OFFSET, 0,2,9, false, 0, "R_IP2K_FR_OFFSET", 0x180, 0x007f),
170 /* Bits 23:16 of an address. */
171 IP2K_HOWTO (R_IP2K_EX8DATA, 16,2,8, false, 0, "R_IP2K_EX8DATA", 0, 0x00ff),
172 };
173
174
175 /* Map BFD reloc types to IP2K ELF reloc types. */
176
177 static reloc_howto_type *
178 ip2k_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
179 bfd_reloc_code_real_type code)
180 {
181 /* Note that the ip2k_elf_howto_table is indxed by the R_
182 constants. Thus, the order that the howto records appear in the
183 table *must* match the order of the relocation types defined in
184 include/elf/ip2k.h. */
185
186 switch (code)
187 {
188 case BFD_RELOC_NONE:
189 return &ip2k_elf_howto_table[ (int) R_IP2K_NONE];
190 case BFD_RELOC_16:
191 return &ip2k_elf_howto_table[ (int) R_IP2K_16];
192 case BFD_RELOC_32:
193 return &ip2k_elf_howto_table[ (int) R_IP2K_32];
194 case BFD_RELOC_IP2K_FR9:
195 return &ip2k_elf_howto_table[ (int) R_IP2K_FR9];
196 case BFD_RELOC_IP2K_BANK:
197 return &ip2k_elf_howto_table[ (int) R_IP2K_BANK];
198 case BFD_RELOC_IP2K_ADDR16CJP:
199 return &ip2k_elf_howto_table[ (int) R_IP2K_ADDR16CJP];
200 case BFD_RELOC_IP2K_PAGE3:
201 return &ip2k_elf_howto_table[ (int) R_IP2K_PAGE3];
202 case BFD_RELOC_IP2K_LO8DATA:
203 return &ip2k_elf_howto_table[ (int) R_IP2K_LO8DATA];
204 case BFD_RELOC_IP2K_HI8DATA:
205 return &ip2k_elf_howto_table[ (int) R_IP2K_HI8DATA];
206 case BFD_RELOC_IP2K_LO8INSN:
207 return &ip2k_elf_howto_table[ (int) R_IP2K_LO8INSN];
208 case BFD_RELOC_IP2K_HI8INSN:
209 return &ip2k_elf_howto_table[ (int) R_IP2K_HI8INSN];
210 case BFD_RELOC_IP2K_PC_SKIP:
211 return &ip2k_elf_howto_table[ (int) R_IP2K_PC_SKIP];
212 case BFD_RELOC_IP2K_TEXT:
213 return &ip2k_elf_howto_table[ (int) R_IP2K_TEXT];
214 case BFD_RELOC_IP2K_FR_OFFSET:
215 return &ip2k_elf_howto_table[ (int) R_IP2K_FR_OFFSET];
216 case BFD_RELOC_IP2K_EX8DATA:
217 return &ip2k_elf_howto_table[ (int) R_IP2K_EX8DATA];
218 default:
219 /* Pacify gcc -Wall. */
220 return NULL;
221 }
222 return NULL;
223 }
224
225 static reloc_howto_type *
226 ip2k_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
227 {
228 unsigned int i;
229
230 for (i = 0;
231 i < sizeof (ip2k_elf_howto_table) / sizeof (ip2k_elf_howto_table[0]);
232 i++)
233 if (ip2k_elf_howto_table[i].name != NULL
234 && strcasecmp (ip2k_elf_howto_table[i].name, r_name) == 0)
235 return &ip2k_elf_howto_table[i];
236
237 return NULL;
238 }
239
240 static void
241 ip2k_get_mem (bfd *abfd ATTRIBUTE_UNUSED,
242 bfd_byte *addr,
243 int length,
244 bfd_byte *ptr)
245 {
246 while (length --)
247 * ptr ++ = bfd_get_8 (abfd, addr ++);
248 }
249
250 static bool
251 ip2k_is_opcode (bfd_byte *code, const struct ip2k_opcode *opcodes)
252 {
253 unsigned short insn = (code[0] << 8) | code[1];
254
255 while (opcodes->mask != 0)
256 {
257 if ((insn & opcodes->mask) == opcodes->opcode)
258 return true;
259
260 opcodes ++;
261 }
262
263 return false;
264 }
265
266 #define PAGENO(ABSADDR) ((ABSADDR) & 0xFFFFC000)
267 #define BASEADDR(SEC) ((SEC)->output_section->vma + (SEC)->output_offset)
268
269 #define UNDEFINED_SYMBOL (~(bfd_vma)0)
270
271 /* Return the value of the symbol associated with the relocation IREL. */
272
273 static bfd_vma
274 symbol_value (bfd *abfd,
275 Elf_Internal_Shdr *symtab_hdr,
276 Elf_Internal_Sym *isymbuf,
277 Elf_Internal_Rela *irel)
278 {
279 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
280 {
281 Elf_Internal_Sym *isym;
282 asection *sym_sec;
283
284 isym = isymbuf + ELF32_R_SYM (irel->r_info);
285 if (isym->st_shndx == SHN_UNDEF)
286 sym_sec = bfd_und_section_ptr;
287 else if (isym->st_shndx == SHN_ABS)
288 sym_sec = bfd_abs_section_ptr;
289 else if (isym->st_shndx == SHN_COMMON)
290 sym_sec = bfd_com_section_ptr;
291 else
292 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
293
294 return isym->st_value + BASEADDR (sym_sec);
295 }
296 else
297 {
298 unsigned long indx;
299 struct elf_link_hash_entry *h;
300
301 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
302 h = elf_sym_hashes (abfd)[indx];
303 BFD_ASSERT (h != NULL);
304
305 if (h->root.type != bfd_link_hash_defined
306 && h->root.type != bfd_link_hash_defweak)
307 return UNDEFINED_SYMBOL;
308
309 return (h->root.u.def.value + BASEADDR (h->root.u.def.section));
310 }
311 }
312
313 /* Determine if the instruction sequence matches that for
314 the prologue of a switch dispatch table with fewer than
315 128 entries.
316
317 sc
318 page $nnn0
319 jmp $nnn0
320 add w,wreg
321 add pcl,w
322 addr=>
323 page $nnn1
324 jmp $nnn1
325 page $nnn2
326 jmp $nnn2
327 ...
328 page $nnnN
329 jmp $nnnN
330
331 After relaxation.
332 sc
333 page $nnn0
334 jmp $nnn0
335 add pcl,w
336 addr=>
337 jmp $nnn1
338 jmp $nnn2
339 ...
340 jmp $nnnN */
341
342 static int
343 ip2k_is_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
344 asection *sec,
345 bfd_vma addr,
346 bfd_byte *contents)
347 {
348 bfd_byte code[4];
349 int table_index = 0;
350
351 /* Check current page-jmp. */
352 if (addr + 4 > sec->size)
353 return -1;
354
355 ip2k_get_mem (abfd, contents + addr, 4, code);
356
357 if ((! IS_PAGE_OPCODE (code + 0))
358 || (! IS_JMP_OPCODE (code + 2)))
359 return -1;
360
361 /* Search back. */
362 while (1)
363 {
364 if (addr < 4)
365 return -1;
366
367 /* Check previous 2 instructions. */
368 ip2k_get_mem (abfd, contents + addr - 4, 4, code);
369 if ((IS_ADD_W_WREG_OPCODE (code + 0))
370 && (IS_ADD_PCL_W_OPCODE (code + 2)))
371 return table_index;
372
373 if ((! IS_PAGE_OPCODE (code + 0))
374 || (! IS_JMP_OPCODE (code + 2)))
375 return -1;
376
377 table_index++;
378 addr -= 4;
379 }
380 }
381
382 /* Determine if the instruction sequence matches that for
383 the prologue switch dispatch table with fewer than
384 256 entries but more than 127.
385
386 Before relaxation.
387 push %lo8insn(label) ; Push address of table
388 push %hi8insn(label)
389 add w,wreg ; index*2 => offset
390 snc ; CARRY SET?
391 inc 1(sp) ; Propagate MSB into table address
392 add 2(sp),w ; Add low bits of offset to table address
393 snc ; and handle any carry-out
394 inc 1(sp)
395 addr=>
396 page __indjmp ; Do an indirect jump to that location
397 jmp __indjmp
398 label: ; case dispatch table starts here
399 page $nnn1
400 jmp $nnn1
401 page $nnn2
402 jmp $nnn2
403 ...
404 page $nnnN
405 jmp $nnnN
406
407 After relaxation.
408 push %lo8insn(label) ; Push address of table
409 push %hi8insn(label)
410 add 2(sp),w ; Add low bits of offset to table address
411 snc ; and handle any carry-out
412 inc 1(sp)
413 addr=>
414 page __indjmp ; Do an indirect jump to that location
415 jmp __indjmp
416 label: ; case dispatch table starts here
417 jmp $nnn1
418 jmp $nnn2
419 ...
420 jmp $nnnN */
421
422 static int
423 ip2k_is_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
424 asection *sec,
425 bfd_vma addr,
426 bfd_byte *contents)
427 {
428 bfd_byte code[16];
429 int table_index = 0;
430
431 /* Check current page-jmp. */
432 if (addr + 4 > sec->size)
433 return -1;
434
435 ip2k_get_mem (abfd, contents + addr, 4, code);
436 if ((! IS_PAGE_OPCODE (code + 0))
437 || (! IS_JMP_OPCODE (code + 2)))
438 return -1;
439
440 /* Search back. */
441 while (1)
442 {
443 if (addr < 16)
444 return -1;
445
446 /* Check previous 8 instructions. */
447 ip2k_get_mem (abfd, contents + addr - 16, 16, code);
448 if ((IS_ADD_W_WREG_OPCODE (code + 0))
449 && (IS_SNC_OPCODE (code + 2))
450 && (IS_INC_1SP_OPCODE (code + 4))
451 && (IS_ADD_2SP_W_OPCODE (code + 6))
452 && (IS_SNC_OPCODE (code + 8))
453 && (IS_INC_1SP_OPCODE (code + 10))
454 && (IS_PAGE_OPCODE (code + 12))
455 && (IS_JMP_OPCODE (code + 14)))
456 return table_index;
457
458 if ((IS_ADD_W_WREG_OPCODE (code + 2))
459 && (IS_SNC_OPCODE (code + 4))
460 && (IS_INC_1SP_OPCODE (code + 6))
461 && (IS_ADD_2SP_W_OPCODE (code + 8))
462 && (IS_SNC_OPCODE (code + 10))
463 && (IS_INC_1SP_OPCODE (code + 12))
464 && (IS_JMP_OPCODE (code + 14)))
465 return table_index;
466
467 if ((! IS_PAGE_OPCODE (code + 0))
468 || (! IS_JMP_OPCODE (code + 2)))
469 return -1;
470
471 table_index++;
472 addr -= 4;
473 }
474 }
475
476 /* Returns the expected page state for the given instruction not including
477 the effect of page instructions. */
478
479 static bfd_vma
480 ip2k_nominal_page_bits (bfd *abfd ATTRIBUTE_UNUSED,
481 asection *sec,
482 bfd_vma addr,
483 bfd_byte *contents)
484 {
485 bfd_vma page = PAGENO (BASEADDR (sec) + addr);
486
487 /* Check if section flows into this page. If not then the page
488 bits are assumed to match the PC. This will be true unless
489 the user has a page instruction without a call/jump, in which
490 case they are on their own. */
491 if (PAGENO (BASEADDR (sec)) == page)
492 return page;
493
494 /* Section flows across page boundary. The page bits should match
495 the PC unless there is a possible flow from the previous page,
496 in which case it is not possible to determine the value of the
497 page bits. */
498 while (PAGENO (BASEADDR (sec) + addr - 2) == page)
499 {
500 bfd_byte code[2];
501
502 addr -= 2;
503 ip2k_get_mem (abfd, contents + addr, 2, code);
504 if (!IS_PAGE_OPCODE (code))
505 continue;
506
507 /* Found a page instruction, check if jump table. */
508 if (ip2k_is_switch_table_128 (abfd, sec, addr, contents) != -1)
509 /* Jump table => page is conditional. */
510 continue;
511
512 if (ip2k_is_switch_table_256 (abfd, sec, addr, contents) != -1)
513 /* Jump table => page is conditional. */
514 continue;
515
516 /* Found a page instruction, check if conditional. */
517 if (addr >= 2)
518 {
519 ip2k_get_mem (abfd, contents + addr - 2, 2, code);
520 if (IS_SKIP_OPCODE (code))
521 /* Page is conditional. */
522 continue;
523 }
524
525 /* Unconditional page instruction => page bits should be correct. */
526 return page;
527 }
528
529 /* Flow from previous page => page bits are impossible to determine. */
530 return 0;
531 }
532
533 static bool
534 ip2k_test_page_insn (bfd *abfd ATTRIBUTE_UNUSED,
535 asection *sec,
536 Elf_Internal_Rela *irel,
537 struct misc *misc)
538 {
539 bfd_vma symval;
540
541 /* Get the value of the symbol referred to by the reloc. */
542 symval = symbol_value (abfd, misc->symtab_hdr, misc->isymbuf, irel);
543 if (symval == UNDEFINED_SYMBOL)
544 /* This appears to be a reference to an undefined
545 symbol. Just ignore it--it will be caught by the
546 regular reloc processing. */
547 return false;
548
549 /* Test if we can delete this page instruction. */
550 if (PAGENO (symval + irel->r_addend) !=
551 ip2k_nominal_page_bits (abfd, sec, irel->r_offset, misc->contents))
552 return false;
553
554 return true;
555 }
556
557 /* Parts of a Stabs entry. */
558
559 #define STRDXOFF 0
560 #define TYPEOFF 4
561 #define OTHEROFF 5
562 #define DESCOFF 6
563 #define VALOFF 8
564 #define STABSIZE 12
565
566 /* Adjust all the relocations entries after adding or inserting instructions. */
567
568 static void
569 adjust_all_relocations (bfd *abfd,
570 asection *sec,
571 bfd_vma addr,
572 bfd_vma endaddr,
573 int count,
574 int noadj)
575 {
576 Elf_Internal_Shdr *symtab_hdr;
577 Elf_Internal_Sym *isymbuf, *isym, *isymend;
578 unsigned int shndx;
579 Elf_Internal_Rela *irel, *irelend, *irelbase;
580 struct elf_link_hash_entry **sym_hashes;
581 struct elf_link_hash_entry **end_hashes;
582 unsigned int symcount;
583 asection *stab;
584
585 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
586 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
587
588 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
589
590 irelbase = elf_section_data (sec)->relocs;
591 irelend = irelbase + sec->reloc_count;
592
593 for (irel = irelbase; irel < irelend; irel++)
594 {
595 if (ELF32_R_TYPE (irel->r_info) != R_IP2K_NONE)
596 {
597 /* Get the value of the symbol referred to by the reloc. */
598 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
599 {
600 asection *sym_sec;
601
602 /* A local symbol. */
603 isym = isymbuf + ELF32_R_SYM (irel->r_info);
604 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
605
606 if (isym->st_shndx == shndx)
607 {
608 bfd_vma baseaddr = BASEADDR (sec);
609 bfd_vma symval = BASEADDR (sym_sec) + isym->st_value
610 + irel->r_addend;
611
612 if ((baseaddr + addr + noadj) <= symval
613 && symval < (baseaddr + endaddr))
614 irel->r_addend += count;
615 }
616 }
617 }
618
619 /* Do this only for PC space relocations. */
620 if (addr <= irel->r_offset && irel->r_offset < endaddr)
621 irel->r_offset += count;
622 }
623
624 /* Now fix the stab relocations. */
625 stab = bfd_get_section_by_name (abfd, ".stab");
626 if (stab && stab->reloc_count != 0)
627 {
628 bfd_byte *stabcontents, *stabend, *stabp;
629 bfd_size_type stab_size = stab->rawsize ? stab->rawsize : stab->size;
630
631 irelbase = elf_section_data (stab)->relocs;
632 irelend = irelbase + stab->reloc_count;
633
634 /* Pull out the contents of the stab section. */
635 if (elf_section_data (stab)->this_hdr.contents != NULL)
636 stabcontents = elf_section_data (stab)->this_hdr.contents;
637 else
638 {
639 if (!bfd_malloc_and_get_section (abfd, stab, &stabcontents))
640 {
641 free (stabcontents);
642 return;
643 }
644
645 /* We need to remember this. */
646 elf_section_data (stab)->this_hdr.contents = stabcontents;
647 }
648
649 stabend = stabcontents + stab_size;
650
651 for (irel = irelbase; irel < irelend; irel++)
652 {
653 if (ELF32_R_TYPE (irel->r_info) != R_IP2K_NONE)
654 {
655 /* Get the value of the symbol referred to by the reloc. */
656 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
657 {
658 asection *sym_sec;
659
660 /* A local symbol. */
661 isym = isymbuf + ELF32_R_SYM (irel->r_info);
662 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
663
664 if (sym_sec == sec)
665 {
666 const char *name;
667 unsigned char type;
668 bfd_vma value;
669 bfd_vma baseaddr = BASEADDR (sec);
670 bfd_vma symval = BASEADDR (sym_sec) + isym->st_value
671 + irel->r_addend;
672
673 if ((baseaddr + addr) <= symval
674 && symval <= (baseaddr + endaddr))
675 irel->r_addend += count;
676
677 /* Go hunt up a function and fix its line info if needed. */
678 stabp = stabcontents + irel->r_offset - 8;
679
680 /* Go pullout the stab entry. */
681 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
682 value = bfd_h_get_32 (abfd, stabp + VALOFF);
683
684 name = bfd_get_stab_name (type);
685
686 if (strcmp (name, "FUN") == 0)
687 {
688 int function_adjusted = 0;
689
690 if (symval > (baseaddr + addr))
691 /* Not in this function. */
692 continue;
693
694 /* Hey we got a function hit. */
695 stabp += STABSIZE;
696 for (;stabp < stabend; stabp += STABSIZE)
697 {
698 /* Go pullout the stab entry. */
699 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
700 value = bfd_h_get_32 (abfd, stabp + VALOFF);
701
702 name = bfd_get_stab_name (type);
703
704 if (strcmp (name, "FUN") == 0)
705 {
706 /* Hit another function entry. */
707 if (function_adjusted)
708 {
709 /* Adjust the value. */
710 value += count;
711
712 /* We need to put it back. */
713 bfd_h_put_32 (abfd, value,stabp + VALOFF);
714 }
715
716 /* And then bale out. */
717 break;
718 }
719
720 if (strcmp (name, "SLINE") == 0)
721 {
722 /* Got a line entry. */
723 if ((baseaddr + addr) <= (symval + value))
724 {
725 /* Adjust the line entry. */
726 value += count;
727
728 /* We need to put it back. */
729 bfd_h_put_32 (abfd, value,stabp + VALOFF);
730 function_adjusted = 1;
731 }
732 }
733 }
734 }
735 }
736 }
737 }
738 }
739 }
740
741 /* When adding an instruction back it is sometimes necessary to move any
742 global or local symbol that was referencing the first instruction of
743 the moved block to refer to the first instruction of the inserted block.
744
745 For example adding a PAGE instruction before a CALL or JMP requires
746 that any label on the CALL or JMP is moved to the PAGE insn. */
747 addr += noadj;
748
749 /* Adjust the local symbols defined in this section. */
750 isymend = isymbuf + symtab_hdr->sh_info;
751 for (isym = isymbuf; isym < isymend; isym++)
752 {
753 if (isym->st_shndx == shndx
754 && addr <= isym->st_value
755 && isym->st_value < endaddr)
756 isym->st_value += count;
757 }
758
759 /* Now adjust the global symbols defined in this section. */
760 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
761 - symtab_hdr->sh_info);
762 sym_hashes = elf_sym_hashes (abfd);
763 end_hashes = sym_hashes + symcount;
764 for (; sym_hashes < end_hashes; sym_hashes++)
765 {
766 struct elf_link_hash_entry *sym_hash = *sym_hashes;
767
768 if ((sym_hash->root.type == bfd_link_hash_defined
769 || sym_hash->root.type == bfd_link_hash_defweak)
770 && sym_hash->root.u.def.section == sec)
771 {
772 if (addr <= sym_hash->root.u.def.value
773 && sym_hash->root.u.def.value < endaddr)
774 sym_hash->root.u.def.value += count;
775 }
776 }
777
778 return;
779 }
780
781 /* Delete some bytes from a section while relaxing. */
782
783 static bool
784 ip2k_elf_relax_delete_bytes (bfd *abfd,
785 asection *sec,
786 bfd_vma addr,
787 int count)
788 {
789 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
790 bfd_vma endaddr = sec->size;
791
792 /* Actually delete the bytes. */
793 memmove (contents + addr, contents + addr + count,
794 endaddr - addr - count);
795
796 sec->size -= count;
797
798 adjust_all_relocations (abfd, sec, addr + count, endaddr, -count, 0);
799 return true;
800 }
801
802 static bool
803 ip2k_delete_page_insn (bfd *abfd ATTRIBUTE_UNUSED,
804 asection *sec,
805 Elf_Internal_Rela *irel,
806 bool *again,
807 struct misc *misc)
808 {
809 /* Note that we've changed the relocs, section contents, etc. */
810 elf_section_data (sec)->relocs = misc->irelbase;
811 elf_section_data (sec)->this_hdr.contents = misc->contents;
812 misc->symtab_hdr->contents = (bfd_byte *) misc->isymbuf;
813
814 /* Fix the relocation's type. */
815 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_IP2K_NONE);
816
817 /* Delete the PAGE insn. */
818 if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset, 2))
819 return false;
820
821 /* Modified => will need to iterate relaxation again. */
822 *again = true;
823
824 return true;
825 }
826
827 static bool
828 ip2k_relax_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
829 asection *sec,
830 Elf_Internal_Rela *irel,
831 bool *again,
832 struct misc *misc)
833 {
834 Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
835 Elf_Internal_Rela *ireltest = irel;
836 bfd_byte code[4];
837 bfd_vma addr;
838
839 /* Test all page instructions. */
840 addr = irel->r_offset;
841 while (1)
842 {
843 if (addr + 4 > sec->size)
844 break;
845
846 ip2k_get_mem (abfd, misc->contents + addr, 4, code);
847 if ((! IS_PAGE_OPCODE (code + 0))
848 || (! IS_JMP_OPCODE (code + 2)))
849 break;
850
851 /* Validate relocation entry (every entry should have a matching
852 relocation entry). */
853 if (ireltest >= irelend)
854 {
855 _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
856 return false;
857 }
858
859 if (ireltest->r_offset != addr)
860 {
861 _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
862 return false;
863 }
864
865 if (! ip2k_test_page_insn (abfd, sec, ireltest, misc))
866 /* Un-removable page insn => nothing can be done. */
867 return true;
868
869 addr += 4;
870 ireltest += 2;
871 }
872
873 /* Relaxable. Adjust table header. */
874 ip2k_get_mem (abfd, misc->contents + irel->r_offset - 4, 4, code);
875 if ((! IS_ADD_W_WREG_OPCODE (code + 0))
876 || (! IS_ADD_PCL_W_OPCODE (code + 2)))
877 {
878 _bfd_error_handler (_("ip2k relaxer: switch table header corrupt."));
879 return false;
880 }
881
882 if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset - 4, 2))
883 return false;
884
885 *again = true;
886
887 /* Delete all page instructions in table. */
888 while (irel < ireltest)
889 {
890 if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc))
891 return false;
892 irel += 2;
893 }
894
895 return true;
896 }
897
898 static bool
899 ip2k_relax_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
900 asection *sec,
901 Elf_Internal_Rela *irel,
902 bool *again,
903 struct misc *misc)
904 {
905 Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
906 Elf_Internal_Rela *ireltest = irel;
907 bfd_byte code[12];
908 bfd_vma addr;
909
910 /* Test all page instructions. */
911 addr = irel->r_offset;
912
913 while (1)
914 {
915 if (addr + 4 > sec->size)
916 break;
917
918 ip2k_get_mem (abfd, misc->contents + addr, 4, code);
919
920 if ((! IS_PAGE_OPCODE (code + 0))
921 || (! IS_JMP_OPCODE (code + 2)))
922 break;
923
924 /* Validate relocation entry (every entry should have a matching
925 relocation entry). */
926 if (ireltest >= irelend)
927 {
928 _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
929 return false;
930 }
931
932 if (ireltest->r_offset != addr)
933 {
934 _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
935 return false;
936 }
937
938 if (!ip2k_test_page_insn (abfd, sec, ireltest, misc))
939 /* Un-removable page insn => nothing can be done. */
940 return true;
941
942 addr += 4;
943 ireltest += 2;
944 }
945
946 /* Relaxable. Adjust table header. */
947 ip2k_get_mem (abfd, misc->contents + irel->r_offset - 4, 2, code);
948 if (IS_PAGE_OPCODE (code))
949 addr = irel->r_offset - 16;
950 else
951 addr = irel->r_offset - 14;
952
953 ip2k_get_mem (abfd, misc->contents + addr, 12, code);
954 if ((!IS_ADD_W_WREG_OPCODE (code + 0))
955 || (!IS_SNC_OPCODE (code + 2))
956 || (!IS_INC_1SP_OPCODE (code + 4))
957 || (!IS_ADD_2SP_W_OPCODE (code + 6))
958 || (!IS_SNC_OPCODE (code + 8))
959 || (!IS_INC_1SP_OPCODE (code + 10)))
960 {
961 _bfd_error_handler (_("ip2k relaxer: switch table header corrupt."));
962 return false;
963 }
964
965 /* Delete first 3 opcodes. */
966 if (!ip2k_elf_relax_delete_bytes (abfd, sec, addr + 0, 6))
967 return false;
968
969 *again = true;
970
971 /* Delete all page instructions in table. */
972 while (irel < ireltest)
973 {
974 if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc))
975 return false;
976 irel += 2;
977 }
978
979 return true;
980 }
981
982 /* This function handles relaxation of a section in a specific page. */
983
984 static bool
985 ip2k_elf_relax_section_page (bfd *abfd,
986 asection *sec,
987 bool *again,
988 struct misc *misc,
989 unsigned long page_start,
990 unsigned long page_end)
991 {
992 Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
993 Elf_Internal_Rela *irel;
994 int switch_table_128;
995 int switch_table_256;
996
997 /* Walk thru the section looking for relaxation opportunities. */
998 for (irel = misc->irelbase; irel < irelend; irel++)
999 {
1000 if (ELF32_R_TYPE (irel->r_info) != (int) R_IP2K_PAGE3)
1001 /* Ignore non page instructions. */
1002 continue;
1003
1004 if (BASEADDR (sec) + irel->r_offset < page_start)
1005 /* Ignore page instructions on earlier page - they have
1006 already been processed. Remember that there is code flow
1007 that crosses a page boundary. */
1008 continue;
1009
1010 if (BASEADDR (sec) + irel->r_offset > page_end)
1011 /* Flow beyond end of page => nothing more to do for this page. */
1012 return true;
1013
1014 /* Detect switch tables. */
1015 switch_table_128 = ip2k_is_switch_table_128 (abfd, sec, irel->r_offset, misc->contents);
1016 switch_table_256 = ip2k_is_switch_table_256 (abfd, sec, irel->r_offset, misc->contents);
1017
1018 if ((switch_table_128 > 0) || (switch_table_256 > 0))
1019 /* If the index is greater than 0 then it has already been processed. */
1020 continue;
1021
1022 if (switch_table_128 == 0)
1023 {
1024 if (!ip2k_relax_switch_table_128 (abfd, sec, irel, again, misc))
1025 return false;
1026
1027 continue;
1028 }
1029
1030 if (switch_table_256 == 0)
1031 {
1032 if (!ip2k_relax_switch_table_256 (abfd, sec, irel, again, misc))
1033 return false;
1034
1035 continue;
1036 }
1037
1038 /* Simple relax. */
1039 if (ip2k_test_page_insn (abfd, sec, irel, misc))
1040 {
1041 if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc))
1042 return false;
1043
1044 continue;
1045 }
1046 }
1047
1048 return true;
1049 }
1050
1051 /* This function handles relaxing for the ip2k.
1052
1053 Principle: Start with the first page and remove page instructions that
1054 are not require on this first page. By removing page instructions more
1055 code will fit into this page - repeat until nothing more can be achieved
1056 for this page. Move on to the next page.
1057
1058 Processing the pages one at a time from the lowest page allows a removal
1059 only policy to be used - pages can be removed but are never reinserted. */
1060
1061 static bool
1062 ip2k_elf_relax_section (bfd *abfd,
1063 asection *sec,
1064 struct bfd_link_info *link_info,
1065 bool *again)
1066 {
1067 Elf_Internal_Shdr *symtab_hdr;
1068 Elf_Internal_Rela *internal_relocs;
1069 bfd_byte *contents = NULL;
1070 Elf_Internal_Sym *isymbuf = NULL;
1071 static asection * first_section = NULL;
1072 static unsigned long search_addr;
1073 static unsigned long page_start = 0;
1074 static unsigned long page_end = 0;
1075 static unsigned int pass = 0;
1076 static bool new_pass = false;
1077 static bool changed = false;
1078 struct misc misc;
1079
1080 /* Assume nothing changes. */
1081 *again = false;
1082
1083 if (first_section == NULL)
1084 {
1085 ip2k_relaxed = true;
1086 first_section = sec;
1087 }
1088
1089 if (first_section == sec)
1090 {
1091 pass++;
1092 new_pass = true;
1093 }
1094
1095 /* We don't have to do anything for a relocatable link,
1096 if this section does not have relocs, or if this is
1097 not a code section. */
1098 if (bfd_link_relocatable (link_info)
1099 || sec->reloc_count == 0
1100 || (sec->flags & SEC_RELOC) == 0
1101 || (sec->flags & SEC_HAS_CONTENTS) == 0
1102 || (sec->flags & SEC_CODE) == 0)
1103 return true;
1104
1105 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1106
1107 internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
1108 link_info->keep_memory);
1109 if (internal_relocs == NULL)
1110 goto error_return;
1111
1112 /* Get section contents cached copy if it exists. */
1113 if (contents == NULL)
1114 {
1115 /* Get cached copy if it exists. */
1116 if (elf_section_data (sec)->this_hdr.contents != NULL)
1117 contents = elf_section_data (sec)->this_hdr.contents;
1118 else
1119 {
1120 /* Go get them off disk. */
1121 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1122 goto error_return;
1123 }
1124 }
1125
1126 /* Read this BFD's symbols cached copy if it exists. */
1127 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
1128 {
1129 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1130 if (isymbuf == NULL)
1131 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1132 symtab_hdr->sh_info, 0,
1133 NULL, NULL, NULL);
1134 if (isymbuf == NULL)
1135 goto error_return;
1136 }
1137
1138 misc.symtab_hdr = symtab_hdr;
1139 misc.isymbuf = isymbuf;
1140 misc.irelbase = internal_relocs;
1141 misc.contents = contents;
1142
1143 /* This is where all the relaxation actually get done. */
1144 if ((pass == 1) || (new_pass && !changed))
1145 {
1146 /* On the first pass we simply search for the lowest page that
1147 we havn't relaxed yet. Note that the pass count is reset
1148 each time a page is complete in order to move on to the next page.
1149 If we can't find any more pages then we are finished. */
1150 if (new_pass)
1151 {
1152 pass = 1;
1153 new_pass = false;
1154 changed = true; /* Pre-initialize to break out of pass 1. */
1155 search_addr = 0xFFFFFFFF;
1156 }
1157
1158 if ((BASEADDR (sec) + sec->size < search_addr)
1159 && (BASEADDR (sec) + sec->size > page_end))
1160 {
1161 if (BASEADDR (sec) <= page_end)
1162 search_addr = page_end + 1;
1163 else
1164 search_addr = BASEADDR (sec);
1165
1166 /* Found a page => more work to do. */
1167 *again = true;
1168 }
1169 }
1170 else
1171 {
1172 if (new_pass)
1173 {
1174 new_pass = false;
1175 changed = false;
1176 page_start = PAGENO (search_addr);
1177 page_end = page_start | 0x00003FFF;
1178 }
1179
1180 /* Only process sections in range. */
1181 if ((BASEADDR (sec) + sec->size >= page_start)
1182 && (BASEADDR (sec) <= page_end))
1183 {
1184 if (!ip2k_elf_relax_section_page (abfd, sec, &changed, &misc, page_start, page_end))
1185 return false;
1186 }
1187 *again = true;
1188 }
1189
1190 /* Perform some house keeping after relaxing the section. */
1191
1192 if (isymbuf != NULL
1193 && symtab_hdr->contents != (unsigned char *) isymbuf)
1194 {
1195 if (! link_info->keep_memory)
1196 free (isymbuf);
1197 else
1198 symtab_hdr->contents = (unsigned char *) isymbuf;
1199 }
1200
1201 if (contents != NULL
1202 && elf_section_data (sec)->this_hdr.contents != contents)
1203 {
1204 if (! link_info->keep_memory)
1205 free (contents);
1206 else
1207 {
1208 /* Cache the section contents for elf_link_input_bfd. */
1209 elf_section_data (sec)->this_hdr.contents = contents;
1210 }
1211 }
1212
1213 if (elf_section_data (sec)->relocs != internal_relocs)
1214 free (internal_relocs);
1215
1216 return true;
1217
1218 error_return:
1219 if (symtab_hdr->contents != (unsigned char *) isymbuf)
1220 free (isymbuf);
1221 if (elf_section_data (sec)->this_hdr.contents != contents)
1222 free (contents);
1223 if (elf_section_data (sec)->relocs != internal_relocs)
1224 free (internal_relocs);
1225 return false;
1226 }
1227
1228 /* Set the howto pointer for a IP2K ELF reloc. */
1229
1230 static bool
1231 ip2k_info_to_howto_rela (bfd * abfd,
1232 arelent * cache_ptr,
1233 Elf_Internal_Rela * dst)
1234 {
1235 unsigned int r_type;
1236
1237 r_type = ELF32_R_TYPE (dst->r_info);
1238 if (r_type >= (unsigned int) R_IP2K_max)
1239 {
1240 /* xgettext:c-format */
1241 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1242 abfd, r_type);
1243 bfd_set_error (bfd_error_bad_value);
1244 return false;
1245 }
1246 cache_ptr->howto = & ip2k_elf_howto_table [r_type];
1247 return true;
1248 }
1249
1250 /* Perform a single relocation.
1251 By default we use the standard BFD routines. */
1252
1253 static bfd_reloc_status_type
1254 ip2k_final_link_relocate (reloc_howto_type * howto,
1255 bfd * input_bfd,
1256 asection * input_section,
1257 bfd_byte * contents,
1258 Elf_Internal_Rela * rel,
1259 bfd_vma relocation)
1260 {
1261 static bfd_vma page_addr = 0;
1262
1263 bfd_reloc_status_type r = bfd_reloc_ok;
1264 switch (howto->type)
1265 {
1266 /* Handle data space relocations. */
1267 case R_IP2K_FR9:
1268 case R_IP2K_BANK:
1269 if ((relocation & IP2K_DATA_MASK) == IP2K_DATA_VALUE)
1270 relocation &= ~IP2K_DATA_MASK;
1271 else
1272 r = bfd_reloc_notsupported;
1273 break;
1274
1275 case R_IP2K_LO8DATA:
1276 case R_IP2K_HI8DATA:
1277 case R_IP2K_EX8DATA:
1278 break;
1279
1280 /* Handle insn space relocations. */
1281 case R_IP2K_PAGE3:
1282 page_addr = BASEADDR (input_section) + rel->r_offset;
1283 if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1284 relocation &= ~IP2K_INSN_MASK;
1285 else
1286 r = bfd_reloc_notsupported;
1287 break;
1288
1289 case R_IP2K_ADDR16CJP:
1290 if (BASEADDR (input_section) + rel->r_offset != page_addr + 2)
1291 {
1292 /* No preceding page instruction, verify that it isn't needed. */
1293 if (PAGENO (relocation + rel->r_addend) !=
1294 ip2k_nominal_page_bits (input_bfd, input_section,
1295 rel->r_offset, contents))
1296 /* xgettext:c-format */
1297 _bfd_error_handler
1298 (_("ip2k linker: missing page instruction "
1299 "at %#" PRIx64 " (dest = %#" PRIx64 ")"),
1300 (uint64_t) (BASEADDR (input_section) + rel->r_offset),
1301 (uint64_t) (relocation + rel->r_addend));
1302 }
1303 else if (ip2k_relaxed)
1304 {
1305 /* Preceding page instruction. Verify that the page instruction is
1306 really needed. One reason for the relaxation to miss a page is if
1307 the section is not marked as executable. */
1308 if (!ip2k_is_switch_table_128 (input_bfd, input_section,
1309 rel->r_offset - 2, contents)
1310 && !ip2k_is_switch_table_256 (input_bfd, input_section,
1311 rel->r_offset - 2, contents)
1312 && (PAGENO (relocation + rel->r_addend) ==
1313 ip2k_nominal_page_bits (input_bfd, input_section,
1314 rel->r_offset - 2, contents)))
1315 /* xgettext:c-format */
1316 _bfd_error_handler
1317 (_("ip2k linker: redundant page instruction "
1318 "at %#" PRIx64 " (dest = %#" PRIx64 ")"),
1319 (uint64_t) page_addr,
1320 (uint64_t) (relocation + rel->r_addend));
1321 }
1322 if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1323 relocation &= ~IP2K_INSN_MASK;
1324 else
1325 r = bfd_reloc_notsupported;
1326 break;
1327
1328 case R_IP2K_LO8INSN:
1329 case R_IP2K_HI8INSN:
1330 case R_IP2K_PC_SKIP:
1331 if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1332 relocation &= ~IP2K_INSN_MASK;
1333 else
1334 r = bfd_reloc_notsupported;
1335 break;
1336
1337 case R_IP2K_16:
1338 /* If this is a relocation involving a TEXT
1339 symbol, reduce it to a word address. */
1340 if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1341 howto = &ip2k_elf_howto_table[ (int) R_IP2K_TEXT];
1342 break;
1343
1344 /* Pass others through. */
1345 default:
1346 break;
1347 }
1348
1349 /* Only install relocation if above tests did not disqualify it. */
1350 if (r == bfd_reloc_ok)
1351 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1352 contents, rel->r_offset,
1353 relocation, rel->r_addend);
1354
1355 return r;
1356 }
1357
1358 /* Relocate a IP2K ELF section.
1359
1360 The RELOCATE_SECTION function is called by the new ELF backend linker
1361 to handle the relocations for a section.
1362
1363 The relocs are always passed as Rela structures; if the section
1364 actually uses Rel structures, the r_addend field will always be
1365 zero.
1366
1367 This function is responsible for adjusting the section contents as
1368 necessary, and (if using Rela relocs and generating a relocatable
1369 output file) adjusting the reloc addend as necessary.
1370
1371 This function does not have to worry about setting the reloc
1372 address or the reloc symbol index.
1373
1374 LOCAL_SYMS is a pointer to the swapped in local symbols.
1375
1376 LOCAL_SECTIONS is an array giving the section in the input file
1377 corresponding to the st_shndx field of each local symbol.
1378
1379 The global hash table entry for the global symbols can be found
1380 via elf_sym_hashes (input_bfd).
1381
1382 When generating relocatable output, this function must handle
1383 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
1384 going to be the section symbol corresponding to the output
1385 section, which means that the addend must be adjusted
1386 accordingly. */
1387
1388 static int
1389 ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1390 struct bfd_link_info *info,
1391 bfd *input_bfd,
1392 asection *input_section,
1393 bfd_byte *contents,
1394 Elf_Internal_Rela *relocs,
1395 Elf_Internal_Sym *local_syms,
1396 asection **local_sections)
1397 {
1398 Elf_Internal_Shdr *symtab_hdr;
1399 struct elf_link_hash_entry **sym_hashes;
1400 Elf_Internal_Rela *rel;
1401 Elf_Internal_Rela *relend;
1402
1403 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1404 sym_hashes = elf_sym_hashes (input_bfd);
1405 relend = relocs + input_section->reloc_count;
1406
1407 for (rel = relocs; rel < relend; rel ++)
1408 {
1409 reloc_howto_type * howto;
1410 unsigned long r_symndx;
1411 Elf_Internal_Sym * sym;
1412 asection * sec;
1413 struct elf_link_hash_entry * h;
1414 bfd_vma relocation;
1415 bfd_reloc_status_type r;
1416 const char * name = NULL;
1417 int r_type;
1418
1419 r_type = ELF32_R_TYPE (rel->r_info);
1420 r_symndx = ELF32_R_SYM (rel->r_info);
1421 howto = ip2k_elf_howto_table + r_type;
1422 h = NULL;
1423 sym = NULL;
1424 sec = NULL;
1425
1426 if (r_symndx < symtab_hdr->sh_info)
1427 {
1428 sym = local_syms + r_symndx;
1429 sec = local_sections [r_symndx];
1430 relocation = BASEADDR (sec) + sym->st_value;
1431
1432 name = bfd_elf_string_from_elf_section
1433 (input_bfd, symtab_hdr->sh_link, sym->st_name);
1434 name = name == NULL ? bfd_section_name (sec) : name;
1435 }
1436 else
1437 {
1438 bool warned, ignored;
1439 bool unresolved_reloc;
1440
1441 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1442 r_symndx, symtab_hdr, sym_hashes,
1443 h, sec, relocation,
1444 unresolved_reloc, warned, ignored);
1445
1446 name = h->root.root.string;
1447 }
1448
1449 if (sec != NULL && discarded_section (sec))
1450 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1451 rel, 1, relend, howto, 0, contents);
1452
1453 if (bfd_link_relocatable (info))
1454 continue;
1455
1456 /* Finally, the sole IP2K-specific part. */
1457 r = ip2k_final_link_relocate (howto, input_bfd, input_section,
1458 contents, rel, relocation);
1459
1460 if (r != bfd_reloc_ok)
1461 {
1462 const char * msg = NULL;
1463
1464 switch (r)
1465 {
1466 case bfd_reloc_overflow:
1467 (*info->callbacks->reloc_overflow)
1468 (info, (h ? &h->root : NULL), name, howto->name,
1469 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1470 break;
1471
1472 case bfd_reloc_undefined:
1473 (*info->callbacks->undefined_symbol)
1474 (info, name, input_bfd, input_section, rel->r_offset, true);
1475 break;
1476
1477 case bfd_reloc_outofrange:
1478 msg = _("internal error: out of range error");
1479 break;
1480
1481 /* This is how ip2k_final_link_relocate tells us of a non-kosher
1482 reference between insn & data address spaces. */
1483 case bfd_reloc_notsupported:
1484 if (sym != NULL) /* Only if it's not an unresolved symbol. */
1485 msg = _("unsupported relocation between data/insn address spaces");
1486 break;
1487
1488 case bfd_reloc_dangerous:
1489 msg = _("internal error: dangerous relocation");
1490 break;
1491
1492 default:
1493 msg = _("internal error: unknown error");
1494 break;
1495 }
1496
1497 if (msg)
1498 (*info->callbacks->warning) (info, msg, name, input_bfd,
1499 input_section, rel->r_offset);
1500 }
1501 }
1502
1503 return true;
1504 }
1505
1506 #define TARGET_BIG_SYM ip2k_elf32_vec
1507 #define TARGET_BIG_NAME "elf32-ip2k"
1508
1509 #define ELF_ARCH bfd_arch_ip2k
1510 #define ELF_MACHINE_CODE EM_IP2K
1511 #define ELF_MACHINE_ALT1 EM_IP2K_OLD
1512 #define ELF_MAXPAGESIZE 1 /* No pages on the IP2K. */
1513
1514 #define elf_info_to_howto_rel NULL
1515 #define elf_info_to_howto ip2k_info_to_howto_rela
1516
1517 #define elf_backend_can_gc_sections 1
1518 #define elf_backend_rela_normal 1
1519 #define elf_backend_relocate_section ip2k_elf_relocate_section
1520
1521 #define elf_symbol_leading_char '_'
1522 #define bfd_elf32_bfd_reloc_type_lookup ip2k_reloc_type_lookup
1523 #define bfd_elf32_bfd_reloc_name_lookup ip2k_reloc_name_lookup
1524 #define bfd_elf32_bfd_relax_section ip2k_elf_relax_section
1525
1526 #include "elf32-target.h"