xref: /netbsd-src/external/gpl3/binutils/dist/bfd/elf32-ip2k.c (revision cef8759bd76c1b621f8eab8faa6f208faabc2e15)
1 /* Ubicom IP2xxx specific support for 32-bit ELF
2    Copyright (C) 2000-2020 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 bfd_boolean 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,3,0, FALSE, 0, "R_IP2K_NONE", 0, 0),
145   /* A 16 bit absolute relocation.  */
146   IP2K_HOWTO (R_IP2K_16, 0,1,16, FALSE, 0, "R_IP2K_16", 0, 0xffff),
147   /* A 32 bit absolute relocation.  */
148   IP2K_HOWTO (R_IP2K_32, 0,2,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,1,9, FALSE, 0, "R_IP2K_FR9", 0, 0x00ff),
151   /* A 4-bit data relocation.  */
152   IP2K_HOWTO (R_IP2K_BANK, 8,1,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,1,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,1,3, FALSE, 0, "R_IP2K_PAGE3", 0, 0x0007),
157   /* Two 8-bit data relocations.  */
158   IP2K_HOWTO (R_IP2K_LO8DATA, 0,1,8, FALSE, 0, "R_IP2K_LO8DATA", 0, 0x00ff),
159   IP2K_HOWTO (R_IP2K_HI8DATA, 8,1,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,1,8, FALSE, 0, "R_IP2K_LO8INSN", 0, 0x00ff),
162   IP2K_HOWTO (R_IP2K_HI8INSN, 9,1,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,1,1, FALSE, 12, "R_IP2K_PC_SKIP", 0xfffe, 0x1000),
166   /* 16 bit word address.  */
167   IP2K_HOWTO (R_IP2K_TEXT, 1,1,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,1,9, FALSE, 0, "R_IP2K_FR_OFFSET", 0x180, 0x007f),
170   /* Bits 23:16 of an address.  */
171   IP2K_HOWTO (R_IP2K_EX8DATA, 16,1,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 bfd_boolean
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 bfd_boolean
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)
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 	      if (stabcontents != NULL)
642 		free (stabcontents);
643 	      return;
644 	    }
645 
646 	  /* We need to remember this.  */
647 	  elf_section_data (stab)->this_hdr.contents = stabcontents;
648 	}
649 
650       stabend = stabcontents + stab_size;
651 
652       for (irel = irelbase; irel < irelend; irel++)
653 	{
654 	  if (ELF32_R_TYPE (irel->r_info) != R_IP2K_NONE)
655 	    {
656 	      /* Get the value of the symbol referred to by the reloc.  */
657 	      if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
658 		{
659 		  asection *sym_sec;
660 
661 		  /* A local symbol.  */
662 		  isym = isymbuf + ELF32_R_SYM (irel->r_info);
663 		  sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
664 
665 		  if (sym_sec == sec)
666 		    {
667 		      const char *name;
668 		      unsigned char type;
669 		      bfd_vma value;
670 		      bfd_vma baseaddr = BASEADDR (sec);
671 		      bfd_vma symval = BASEADDR (sym_sec) + isym->st_value
672 			+ irel->r_addend;
673 
674 		      if ((baseaddr + addr) <= symval
675 			  && symval <= (baseaddr + endaddr))
676 			irel->r_addend += count;
677 
678 		      /* Go hunt up a function and fix its line info if needed.  */
679 		      stabp = stabcontents + irel->r_offset - 8;
680 
681 		      /* Go pullout the stab entry.  */
682 		      type  = bfd_h_get_8 (abfd, stabp + TYPEOFF);
683 		      value = bfd_h_get_32 (abfd, stabp + VALOFF);
684 
685 		      name = bfd_get_stab_name (type);
686 
687 		      if (strcmp (name, "FUN") == 0)
688 			{
689 			  int function_adjusted = 0;
690 
691 			  if (symval > (baseaddr + addr))
692 			    /* Not in this function.  */
693 			    continue;
694 
695 			  /* Hey we got a function hit.  */
696 			  stabp += STABSIZE;
697 			  for (;stabp < stabend; stabp += STABSIZE)
698 			    {
699 			      /* Go pullout the stab entry.  */
700 			      type  = bfd_h_get_8 (abfd, stabp + TYPEOFF);
701 			      value = bfd_h_get_32 (abfd, stabp + VALOFF);
702 
703 			      name = bfd_get_stab_name (type);
704 
705 			      if (strcmp (name, "FUN") == 0)
706 				{
707 				  /* Hit another function entry.  */
708 				  if (function_adjusted)
709 				    {
710 				      /* Adjust the value.  */
711 				      value += count;
712 
713 				      /* We need to put it back.  */
714 				      bfd_h_put_32 (abfd, value,stabp + VALOFF);
715 				    }
716 
717 				  /* And then bale out.  */
718 				  break;
719 				}
720 
721 			      if (strcmp (name, "SLINE") == 0)
722 				{
723 				  /* Got a line entry.  */
724 				  if ((baseaddr + addr) <= (symval + value))
725 				    {
726 				      /* Adjust the line entry.  */
727 				      value += count;
728 
729 				      /* We need to put it back.  */
730 				      bfd_h_put_32 (abfd, value,stabp + VALOFF);
731 				      function_adjusted = 1;
732 				    }
733 				}
734 			    }
735 			}
736 		    }
737 		}
738 	    }
739 	}
740     }
741 
742   /* When adding an instruction back it is sometimes necessary to move any
743      global or local symbol that was referencing the first instruction of
744      the moved block to refer to the first instruction of the inserted block.
745 
746      For example adding a PAGE instruction before a CALL or JMP requires
747      that any label on the CALL or JMP is moved to the PAGE insn.  */
748   addr += noadj;
749 
750   /* Adjust the local symbols defined in this section.  */
751   isymend = isymbuf + symtab_hdr->sh_info;
752   for (isym = isymbuf; isym < isymend; isym++)
753     {
754       if (isym->st_shndx == shndx
755 	  && addr <= isym->st_value
756 	  && isym->st_value < endaddr)
757 	isym->st_value += count;
758     }
759 
760   /* Now adjust the global symbols defined in this section.  */
761   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
762 	      - symtab_hdr->sh_info);
763   sym_hashes = elf_sym_hashes (abfd);
764   end_hashes = sym_hashes + symcount;
765   for (; sym_hashes < end_hashes; sym_hashes++)
766     {
767       struct elf_link_hash_entry *sym_hash = *sym_hashes;
768 
769       if ((sym_hash->root.type == bfd_link_hash_defined
770 	   || sym_hash->root.type == bfd_link_hash_defweak)
771 	  && sym_hash->root.u.def.section == sec)
772 	{
773 	  if (addr <= sym_hash->root.u.def.value
774 	      && sym_hash->root.u.def.value < endaddr)
775 	    sym_hash->root.u.def.value += count;
776 	}
777     }
778 
779   return;
780 }
781 
782 /* Delete some bytes from a section while relaxing.  */
783 
784 static bfd_boolean
785 ip2k_elf_relax_delete_bytes (bfd *abfd,
786 			     asection *sec,
787 			     bfd_vma addr,
788 			     int count)
789 {
790   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
791   bfd_vma endaddr = sec->size;
792 
793   /* Actually delete the bytes.  */
794   memmove (contents + addr, contents + addr + count,
795 	   endaddr - addr - count);
796 
797   sec->size -= count;
798 
799   adjust_all_relocations (abfd, sec, addr + count, endaddr, -count, 0);
800   return TRUE;
801 }
802 
803 static bfd_boolean
804 ip2k_delete_page_insn (bfd *abfd ATTRIBUTE_UNUSED,
805 		       asection *sec,
806 		       Elf_Internal_Rela *irel,
807 		       bfd_boolean *again,
808 		       struct misc *misc)
809 {
810   /* Note that we've changed the relocs, section contents, etc.  */
811   elf_section_data (sec)->relocs = misc->irelbase;
812   elf_section_data (sec)->this_hdr.contents = misc->contents;
813   misc->symtab_hdr->contents = (bfd_byte *) misc->isymbuf;
814 
815   /* Fix the relocation's type.  */
816   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_IP2K_NONE);
817 
818   /* Delete the PAGE insn.  */
819   if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset, 2))
820     return FALSE;
821 
822   /* Modified => will need to iterate relaxation again.  */
823   *again = TRUE;
824 
825   return TRUE;
826 }
827 
828 static bfd_boolean
829 ip2k_relax_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
830 			     asection *sec,
831 			     Elf_Internal_Rela *irel,
832 			     bfd_boolean *again,
833 			     struct misc *misc)
834 {
835   Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
836   Elf_Internal_Rela *ireltest = irel;
837   bfd_byte code[4];
838   bfd_vma addr;
839 
840   /* Test all page instructions.  */
841   addr = irel->r_offset;
842   while (1)
843     {
844       if (addr + 4 > sec->size)
845 	break;
846 
847       ip2k_get_mem (abfd, misc->contents + addr, 4, code);
848       if ((! IS_PAGE_OPCODE (code + 0))
849 	  || (! IS_JMP_OPCODE (code + 2)))
850 	break;
851 
852       /* Validate relocation entry (every entry should have a matching
853 	  relocation entry).  */
854       if (ireltest >= irelend)
855 	{
856 	  _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
857 	  return FALSE;
858 	}
859 
860       if (ireltest->r_offset != addr)
861 	{
862 	  _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
863 	  return FALSE;
864 	}
865 
866       if (! ip2k_test_page_insn (abfd, sec, ireltest, misc))
867 	/* Un-removable page insn => nothing can be done.  */
868 	return TRUE;
869 
870       addr += 4;
871       ireltest += 2;
872     }
873 
874   /* Relaxable. Adjust table header.  */
875   ip2k_get_mem (abfd, misc->contents + irel->r_offset - 4, 4, code);
876   if ((! IS_ADD_W_WREG_OPCODE (code + 0))
877       || (! IS_ADD_PCL_W_OPCODE (code + 2)))
878     {
879       _bfd_error_handler (_("ip2k relaxer: switch table header corrupt."));
880       return FALSE;
881     }
882 
883   if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset - 4, 2))
884     return FALSE;
885 
886   *again = TRUE;
887 
888   /* Delete all page instructions in table.  */
889   while (irel < ireltest)
890     {
891       if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc))
892 	return FALSE;
893       irel += 2;
894     }
895 
896   return TRUE;
897 }
898 
899 static bfd_boolean
900 ip2k_relax_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
901 			     asection *sec,
902 			     Elf_Internal_Rela *irel,
903 			     bfd_boolean *again,
904 			     struct misc *misc)
905 {
906   Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
907   Elf_Internal_Rela *ireltest = irel;
908   bfd_byte code[12];
909   bfd_vma addr;
910 
911   /* Test all page instructions.  */
912   addr = irel->r_offset;
913 
914   while (1)
915     {
916       if (addr + 4 > sec->size)
917 	break;
918 
919       ip2k_get_mem (abfd, misc->contents + addr, 4, code);
920 
921       if ((! IS_PAGE_OPCODE (code + 0))
922 	  || (! IS_JMP_OPCODE (code + 2)))
923 	break;
924 
925       /* Validate relocation entry (every entry should have a matching
926 	  relocation entry).  */
927       if (ireltest >= irelend)
928 	{
929 	  _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
930 	  return FALSE;
931 	}
932 
933       if (ireltest->r_offset != addr)
934 	{
935 	  _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
936 	  return FALSE;
937 	}
938 
939       if (!ip2k_test_page_insn (abfd, sec, ireltest, misc))
940 	/* Un-removable page insn => nothing can be done.  */
941 	return TRUE;
942 
943       addr += 4;
944       ireltest += 2;
945     }
946 
947   /* Relaxable. Adjust table header.  */
948   ip2k_get_mem (abfd, misc->contents + irel->r_offset - 4, 2, code);
949   if (IS_PAGE_OPCODE (code))
950     addr = irel->r_offset - 16;
951   else
952     addr = irel->r_offset - 14;
953 
954   ip2k_get_mem (abfd, misc->contents + addr, 12, code);
955   if ((!IS_ADD_W_WREG_OPCODE (code + 0))
956       || (!IS_SNC_OPCODE (code + 2))
957       || (!IS_INC_1SP_OPCODE (code + 4))
958       || (!IS_ADD_2SP_W_OPCODE (code + 6))
959       || (!IS_SNC_OPCODE (code + 8))
960       || (!IS_INC_1SP_OPCODE (code + 10)))
961     {
962       _bfd_error_handler (_("ip2k relaxer: switch table header corrupt."));
963       return FALSE;
964     }
965 
966   /* Delete first 3 opcodes.  */
967   if (!ip2k_elf_relax_delete_bytes (abfd, sec, addr + 0, 6))
968     return FALSE;
969 
970   *again = TRUE;
971 
972   /* Delete all page instructions in table.  */
973   while (irel < ireltest)
974     {
975       if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc))
976 	return FALSE;
977       irel += 2;
978     }
979 
980   return TRUE;
981 }
982 
983 /* This function handles relaxation of a section in a specific page.  */
984 
985 static bfd_boolean
986 ip2k_elf_relax_section_page (bfd *abfd,
987 			     asection *sec,
988 			     bfd_boolean *again,
989 			     struct misc *misc,
990 			     unsigned long page_start,
991 			     unsigned long page_end)
992 {
993   Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
994   Elf_Internal_Rela *irel;
995   int switch_table_128;
996   int switch_table_256;
997 
998   /* Walk thru the section looking for relaxation opportunities.  */
999   for (irel = misc->irelbase; irel < irelend; irel++)
1000     {
1001       if (ELF32_R_TYPE (irel->r_info) != (int) R_IP2K_PAGE3)
1002 	/* Ignore non page instructions.  */
1003 	continue;
1004 
1005       if (BASEADDR (sec) + irel->r_offset < page_start)
1006 	/* Ignore page instructions on earlier page - they have
1007 	   already been processed. Remember that there is code flow
1008 	   that crosses a page boundary.  */
1009 	continue;
1010 
1011       if (BASEADDR (sec) + irel->r_offset > page_end)
1012 	/* Flow beyond end of page => nothing more to do for this page.  */
1013 	return TRUE;
1014 
1015       /* Detect switch tables.  */
1016       switch_table_128 = ip2k_is_switch_table_128 (abfd, sec, irel->r_offset, misc->contents);
1017       switch_table_256 = ip2k_is_switch_table_256 (abfd, sec, irel->r_offset, misc->contents);
1018 
1019       if ((switch_table_128 > 0) || (switch_table_256 > 0))
1020 	/* If the index is greater than 0 then it has already been processed.  */
1021 	continue;
1022 
1023       if (switch_table_128 == 0)
1024 	{
1025 	  if (!ip2k_relax_switch_table_128 (abfd, sec, irel, again, misc))
1026 	    return FALSE;
1027 
1028 	  continue;
1029 	}
1030 
1031       if (switch_table_256 == 0)
1032 	{
1033 	  if (!ip2k_relax_switch_table_256 (abfd, sec, irel, again, misc))
1034 	    return FALSE;
1035 
1036 	  continue;
1037 	}
1038 
1039       /* Simple relax.  */
1040       if (ip2k_test_page_insn (abfd, sec, irel, misc))
1041 	{
1042 	  if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc))
1043 	    return FALSE;
1044 
1045 	  continue;
1046 	}
1047     }
1048 
1049   return TRUE;
1050 }
1051 
1052 /* This function handles relaxing for the ip2k.
1053 
1054    Principle: Start with the first page and remove page instructions that
1055    are not require on this first page. By removing page instructions more
1056    code will fit into this page - repeat until nothing more can be achieved
1057    for this page. Move on to the next page.
1058 
1059    Processing the pages one at a time from the lowest page allows a removal
1060    only policy to be used - pages can be removed but are never reinserted.  */
1061 
1062 static bfd_boolean
1063 ip2k_elf_relax_section (bfd *abfd,
1064 			asection *sec,
1065 			struct bfd_link_info *link_info,
1066 			bfd_boolean *again)
1067 {
1068   Elf_Internal_Shdr *symtab_hdr;
1069   Elf_Internal_Rela *internal_relocs;
1070   bfd_byte *contents = NULL;
1071   Elf_Internal_Sym *isymbuf = NULL;
1072   static asection * first_section = NULL;
1073   static unsigned long search_addr;
1074   static unsigned long page_start = 0;
1075   static unsigned long page_end = 0;
1076   static unsigned int pass = 0;
1077   static bfd_boolean new_pass = FALSE;
1078   static bfd_boolean changed = FALSE;
1079   struct misc misc;
1080 
1081   /* Assume nothing changes.  */
1082   *again = FALSE;
1083 
1084   if (first_section == NULL)
1085     {
1086       ip2k_relaxed = TRUE;
1087       first_section = sec;
1088     }
1089 
1090   if (first_section == sec)
1091     {
1092       pass++;
1093       new_pass = TRUE;
1094     }
1095 
1096   /* We don't have to do anything for a relocatable link,
1097      if this section does not have relocs, or if this is
1098      not a code section.  */
1099   if (bfd_link_relocatable (link_info)
1100       || (sec->flags & SEC_RELOC) == 0
1101       || sec->reloc_count == 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 (internal_relocs != NULL
1214       && elf_section_data (sec)->relocs != internal_relocs)
1215     free (internal_relocs);
1216 
1217   return TRUE;
1218 
1219  error_return:
1220   if (isymbuf != NULL
1221       && symtab_hdr->contents != (unsigned char *) isymbuf)
1222     free (isymbuf);
1223   if (contents != NULL
1224       && elf_section_data (sec)->this_hdr.contents != contents)
1225     free (contents);
1226   if (internal_relocs != NULL
1227       && elf_section_data (sec)->relocs != internal_relocs)
1228     free (internal_relocs);
1229   return FALSE;
1230 }
1231 
1232 /* Set the howto pointer for a IP2K ELF reloc.  */
1233 
1234 static bfd_boolean
1235 ip2k_info_to_howto_rela (bfd * abfd,
1236 			 arelent * cache_ptr,
1237 			 Elf_Internal_Rela * dst)
1238 {
1239   unsigned int r_type;
1240 
1241   r_type = ELF32_R_TYPE (dst->r_info);
1242   if (r_type >= (unsigned int) R_IP2K_max)
1243     {
1244       /* xgettext:c-format */
1245       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1246 			  abfd, r_type);
1247       bfd_set_error (bfd_error_bad_value);
1248       return FALSE;
1249     }
1250   cache_ptr->howto = & ip2k_elf_howto_table [r_type];
1251   return TRUE;
1252 }
1253 
1254 /* Perform a single relocation.
1255    By default we use the standard BFD routines.  */
1256 
1257 static bfd_reloc_status_type
1258 ip2k_final_link_relocate (reloc_howto_type *  howto,
1259 			  bfd *		      input_bfd,
1260 			  asection *	      input_section,
1261 			  bfd_byte *	      contents,
1262 			  Elf_Internal_Rela * rel,
1263 			  bfd_vma	      relocation)
1264 {
1265   static bfd_vma page_addr = 0;
1266 
1267   bfd_reloc_status_type r = bfd_reloc_ok;
1268   switch (howto->type)
1269     {
1270       /* Handle data space relocations.  */
1271     case R_IP2K_FR9:
1272     case R_IP2K_BANK:
1273       if ((relocation & IP2K_DATA_MASK) == IP2K_DATA_VALUE)
1274 	relocation &= ~IP2K_DATA_MASK;
1275       else
1276 	r = bfd_reloc_notsupported;
1277       break;
1278 
1279     case R_IP2K_LO8DATA:
1280     case R_IP2K_HI8DATA:
1281     case R_IP2K_EX8DATA:
1282       break;
1283 
1284       /* Handle insn space relocations.  */
1285     case R_IP2K_PAGE3:
1286       page_addr = BASEADDR (input_section) + rel->r_offset;
1287       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1288 	relocation &= ~IP2K_INSN_MASK;
1289       else
1290 	r = bfd_reloc_notsupported;
1291       break;
1292 
1293     case R_IP2K_ADDR16CJP:
1294       if (BASEADDR (input_section) + rel->r_offset != page_addr + 2)
1295 	{
1296 	  /* No preceding page instruction, verify that it isn't needed.  */
1297 	  if (PAGENO (relocation + rel->r_addend) !=
1298 	      ip2k_nominal_page_bits (input_bfd, input_section,
1299 				      rel->r_offset, contents))
1300 	    /* xgettext:c-format */
1301 	    _bfd_error_handler
1302 	      (_("ip2k linker: missing page instruction "
1303 		 "at %#" PRIx64 " (dest = %#" PRIx64 ")"),
1304 	       (uint64_t) (BASEADDR (input_section) + rel->r_offset),
1305 	       (uint64_t) (relocation + rel->r_addend));
1306 	}
1307       else if (ip2k_relaxed)
1308 	{
1309 	  /* Preceding page instruction. Verify that the page instruction is
1310 	     really needed. One reason for the relaxation to miss a page is if
1311 	     the section is not marked as executable.  */
1312 	  if (!ip2k_is_switch_table_128 (input_bfd, input_section,
1313 					 rel->r_offset - 2, contents)
1314 	      && !ip2k_is_switch_table_256 (input_bfd, input_section,
1315 					    rel->r_offset - 2, contents)
1316 	      && (PAGENO (relocation + rel->r_addend) ==
1317 		  ip2k_nominal_page_bits (input_bfd, input_section,
1318 					  rel->r_offset - 2, contents)))
1319 	    /* xgettext:c-format */
1320 	    _bfd_error_handler
1321 	      (_("ip2k linker: redundant page instruction "
1322 		 "at %#" PRIx64 " (dest = %#" PRIx64 ")"),
1323 	       (uint64_t) page_addr,
1324 	       (uint64_t) (relocation + rel->r_addend));
1325 	}
1326       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1327 	relocation &= ~IP2K_INSN_MASK;
1328       else
1329 	r = bfd_reloc_notsupported;
1330       break;
1331 
1332     case R_IP2K_LO8INSN:
1333     case R_IP2K_HI8INSN:
1334     case R_IP2K_PC_SKIP:
1335       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1336 	relocation &= ~IP2K_INSN_MASK;
1337       else
1338 	r = bfd_reloc_notsupported;
1339       break;
1340 
1341     case R_IP2K_16:
1342       /* If this is a relocation involving a TEXT
1343 	 symbol, reduce it to a word address.  */
1344       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1345 	howto = &ip2k_elf_howto_table[ (int) R_IP2K_TEXT];
1346       break;
1347 
1348       /* Pass others through.  */
1349     default:
1350       break;
1351     }
1352 
1353   /* Only install relocation if above tests did not disqualify it.  */
1354   if (r == bfd_reloc_ok)
1355     r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1356 				  contents, rel->r_offset,
1357 				  relocation, rel->r_addend);
1358 
1359   return r;
1360 }
1361 
1362 /* Relocate a IP2K ELF section.
1363 
1364    The RELOCATE_SECTION function is called by the new ELF backend linker
1365    to handle the relocations for a section.
1366 
1367    The relocs are always passed as Rela structures; if the section
1368    actually uses Rel structures, the r_addend field will always be
1369    zero.
1370 
1371    This function is responsible for adjusting the section contents as
1372    necessary, and (if using Rela relocs and generating a relocatable
1373    output file) adjusting the reloc addend as necessary.
1374 
1375    This function does not have to worry about setting the reloc
1376    address or the reloc symbol index.
1377 
1378    LOCAL_SYMS is a pointer to the swapped in local symbols.
1379 
1380    LOCAL_SECTIONS is an array giving the section in the input file
1381    corresponding to the st_shndx field of each local symbol.
1382 
1383    The global hash table entry for the global symbols can be found
1384    via elf_sym_hashes (input_bfd).
1385 
1386    When generating relocatable output, this function must handle
1387    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
1388    going to be the section symbol corresponding to the output
1389    section, which means that the addend must be adjusted
1390    accordingly.  */
1391 
1392 static bfd_boolean
1393 ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1394 			   struct bfd_link_info *info,
1395 			   bfd *input_bfd,
1396 			   asection *input_section,
1397 			   bfd_byte *contents,
1398 			   Elf_Internal_Rela *relocs,
1399 			   Elf_Internal_Sym *local_syms,
1400 			   asection **local_sections)
1401 {
1402   Elf_Internal_Shdr *symtab_hdr;
1403   struct elf_link_hash_entry **sym_hashes;
1404   Elf_Internal_Rela *rel;
1405   Elf_Internal_Rela *relend;
1406 
1407   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1408   sym_hashes = elf_sym_hashes (input_bfd);
1409   relend     = relocs + input_section->reloc_count;
1410 
1411   for (rel = relocs; rel < relend; rel ++)
1412     {
1413       reloc_howto_type *	   howto;
1414       unsigned long		   r_symndx;
1415       Elf_Internal_Sym *	   sym;
1416       asection *		   sec;
1417       struct elf_link_hash_entry * h;
1418       bfd_vma			   relocation;
1419       bfd_reloc_status_type	   r;
1420       const char *		   name = NULL;
1421       int			   r_type;
1422 
1423       r_type = ELF32_R_TYPE (rel->r_info);
1424       r_symndx = ELF32_R_SYM (rel->r_info);
1425       howto  = ip2k_elf_howto_table + r_type;
1426       h      = NULL;
1427       sym    = NULL;
1428       sec    = NULL;
1429 
1430       if (r_symndx < symtab_hdr->sh_info)
1431 	{
1432 	  sym = local_syms + r_symndx;
1433 	  sec = local_sections [r_symndx];
1434 	  relocation = BASEADDR (sec) + sym->st_value;
1435 
1436 	  name = bfd_elf_string_from_elf_section
1437 	    (input_bfd, symtab_hdr->sh_link, sym->st_name);
1438 	  name = name == NULL ? bfd_section_name (sec) : name;
1439 	}
1440       else
1441 	{
1442 	  bfd_boolean warned, ignored;
1443 	  bfd_boolean unresolved_reloc;
1444 
1445 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1446 				   r_symndx, symtab_hdr, sym_hashes,
1447 				   h, sec, relocation,
1448 				   unresolved_reloc, warned, ignored);
1449 
1450 	  name = h->root.root.string;
1451 	}
1452 
1453       if (sec != NULL && discarded_section (sec))
1454 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1455 					 rel, 1, relend, howto, 0, contents);
1456 
1457       if (bfd_link_relocatable (info))
1458 	continue;
1459 
1460       /* Finally, the sole IP2K-specific part.  */
1461       r = ip2k_final_link_relocate (howto, input_bfd, input_section,
1462 				     contents, rel, relocation);
1463 
1464       if (r != bfd_reloc_ok)
1465 	{
1466 	  const char * msg = NULL;
1467 
1468 	  switch (r)
1469 	    {
1470 	    case bfd_reloc_overflow:
1471 	      (*info->callbacks->reloc_overflow)
1472 		(info, (h ? &h->root : NULL), name, howto->name,
1473 		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1474 	      break;
1475 
1476 	    case bfd_reloc_undefined:
1477 	      (*info->callbacks->undefined_symbol)
1478 		(info, name, input_bfd, input_section, rel->r_offset, TRUE);
1479 	      break;
1480 
1481 	    case bfd_reloc_outofrange:
1482 	      msg = _("internal error: out of range error");
1483 	      break;
1484 
1485 	      /* This is how ip2k_final_link_relocate tells us of a non-kosher
1486 		 reference between insn & data address spaces.  */
1487 	    case bfd_reloc_notsupported:
1488 	      if (sym != NULL) /* Only if it's not an unresolved symbol.  */
1489 		 msg = _("unsupported relocation between data/insn address spaces");
1490 	      break;
1491 
1492 	    case bfd_reloc_dangerous:
1493 	      msg = _("internal error: dangerous relocation");
1494 	      break;
1495 
1496 	    default:
1497 	      msg = _("internal error: unknown error");
1498 	      break;
1499 	    }
1500 
1501 	  if (msg)
1502 	    (*info->callbacks->warning) (info, msg, name, input_bfd,
1503 					 input_section, rel->r_offset);
1504 	}
1505     }
1506 
1507   return TRUE;
1508 }
1509 
1510 #define TARGET_BIG_SYM	 ip2k_elf32_vec
1511 #define TARGET_BIG_NAME  "elf32-ip2k"
1512 
1513 #define ELF_ARCH	 bfd_arch_ip2k
1514 #define ELF_MACHINE_CODE EM_IP2K
1515 #define ELF_MACHINE_ALT1 EM_IP2K_OLD
1516 #define ELF_MAXPAGESIZE  1 /* No pages on the IP2K.  */
1517 
1518 #define elf_info_to_howto_rel			NULL
1519 #define elf_info_to_howto			ip2k_info_to_howto_rela
1520 
1521 #define elf_backend_can_gc_sections		1
1522 #define elf_backend_rela_normal			1
1523 #define elf_backend_relocate_section		ip2k_elf_relocate_section
1524 
1525 #define elf_symbol_leading_char			'_'
1526 #define bfd_elf32_bfd_reloc_type_lookup		ip2k_reloc_type_lookup
1527 #define bfd_elf32_bfd_reloc_name_lookup	ip2k_reloc_name_lookup
1528 #define bfd_elf32_bfd_relax_section		ip2k_elf_relax_section
1529 
1530 #include "elf32-target.h"
1531