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