1 /* Ubicom IP2xxx specific support for 32-bit ELF
2    Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
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 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 index;
373 
374       if ((! IS_PAGE_OPCODE (code + 0))
375 	  || (! IS_JMP_OPCODE (code + 2)))
376 	return -1;
377 
378       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 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 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 index;
467 
468       if ((! IS_PAGE_OPCODE (code + 0))
469 	  || (! IS_JMP_OPCODE (code + 2)))
470 	return -1;
471 
472       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   bfd_byte *contents;
581   Elf_Internal_Rela *irel, *irelend, *irelbase;
582   struct elf_link_hash_entry **sym_hashes;
583   struct elf_link_hash_entry **end_hashes;
584   unsigned int symcount;
585   asection *stab;
586 
587   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
588   isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
589 
590   shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
591 
592   contents = elf_section_data (sec)->this_hdr.contents;
593 
594   irelbase = elf_section_data (sec)->relocs;
595   irelend = irelbase + sec->reloc_count;
596 
597   for (irel = irelbase; irel < irelend; irel++)
598     {
599       if (ELF32_R_TYPE (irel->r_info) != R_IP2K_NONE)
600         {
601           /* Get the value of the symbol referred to by the reloc.  */
602           if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
603             {
604               asection *sym_sec;
605 
606               /* A local symbol.  */
607 	      isym = isymbuf + ELF32_R_SYM (irel->r_info);
608               sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
609 
610               if (isym->st_shndx == shndx)
611                 {
612                   bfd_vma baseaddr = BASEADDR (sec);
613                   bfd_vma symval = BASEADDR (sym_sec) + isym->st_value
614                                    + irel->r_addend;
615 
616                   if ((baseaddr + addr + noadj) <= symval
617                       && symval < (baseaddr + endaddr))
618                     irel->r_addend += count;
619                 }
620             }
621         }
622 
623       /* Do this only for PC space relocations.  */
624       if (addr <= irel->r_offset && irel->r_offset < endaddr)
625         irel->r_offset += count;
626     }
627 
628   /* Now fix the stab relocations.  */
629   stab = bfd_get_section_by_name (abfd, ".stab");
630   if (stab)
631     {
632       bfd_byte *stabcontents, *stabend, *stabp;
633       bfd_size_type stab_size = stab->rawsize ? stab->rawsize : stab->size;
634 
635       irelbase = elf_section_data (stab)->relocs;
636       irelend = irelbase + stab->reloc_count;
637 
638       /* Pull out the contents of the stab section.  */
639       if (elf_section_data (stab)->this_hdr.contents != NULL)
640 	stabcontents = elf_section_data (stab)->this_hdr.contents;
641       else
642 	{
643 	  if (!bfd_malloc_and_get_section (abfd, stab, &stabcontents))
644 	    {
645 	      if (stabcontents != NULL)
646 		free (stabcontents);
647 	      return;
648 	    }
649 
650 	  /* We need to remember this.  */
651 	  elf_section_data (stab)->this_hdr.contents = stabcontents;
652 	}
653 
654       stabend = stabcontents + stab_size;
655 
656       for (irel = irelbase; irel < irelend; irel++)
657 	{
658 	  if (ELF32_R_TYPE (irel->r_info) != R_IP2K_NONE)
659 	    {
660 	      /* Get the value of the symbol referred to by the reloc.  */
661 	      if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
662 		{
663 		  asection *sym_sec;
664 
665 		  /* A local symbol.  */
666 		  isym = isymbuf + ELF32_R_SYM (irel->r_info);
667 		  sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
668 
669 		  if (sym_sec == sec)
670 		    {
671 		      const char *name;
672 		      unsigned long strx;
673 		      unsigned char type, other;
674 		      unsigned short desc;
675 		      bfd_vma value;
676 		      bfd_vma baseaddr = BASEADDR (sec);
677 		      bfd_vma symval = BASEADDR (sym_sec) + isym->st_value
678 			+ irel->r_addend;
679 
680 		      if ((baseaddr + addr) <= symval
681 			  && symval <= (baseaddr + endaddr))
682 			irel->r_addend += count;
683 
684 		      /* Go hunt up a function and fix its line info if needed.  */
685 		      stabp = stabcontents + irel->r_offset - 8;
686 
687 		      /* Go pullout the stab entry.  */
688 		      strx  = bfd_h_get_32 (abfd, stabp + STRDXOFF);
689 		      type  = bfd_h_get_8 (abfd, stabp + TYPEOFF);
690 		      other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
691 		      desc  = bfd_h_get_16 (abfd, stabp + DESCOFF);
692 		      value = bfd_h_get_32 (abfd, stabp + VALOFF);
693 
694 		      name = bfd_get_stab_name (type);
695 
696 		      if (strcmp (name, "FUN") == 0)
697 			{
698 			  int function_adjusted = 0;
699 
700 			  if (symval > (baseaddr + addr))
701 			    /* Not in this function.  */
702 			    continue;
703 
704 			  /* Hey we got a function hit.  */
705 			  stabp += STABSIZE;
706 			  for (;stabp < stabend; stabp += STABSIZE)
707 			    {
708 			      /* Go pullout the stab entry.  */
709 			      strx  = bfd_h_get_32 (abfd, stabp + STRDXOFF);
710 			      type  = bfd_h_get_8 (abfd, stabp + TYPEOFF);
711 			      other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
712 			      desc  = bfd_h_get_16 (abfd, stabp + DESCOFF);
713 			      value = bfd_h_get_32 (abfd, stabp + VALOFF);
714 
715 			      name = bfd_get_stab_name (type);
716 
717 			      if (strcmp (name, "FUN") == 0)
718 				{
719 				  /* Hit another function entry.  */
720 				  if (function_adjusted)
721 				    {
722 				      /* Adjust the value.  */
723 				      value += count;
724 
725 				      /* We need to put it back.  */
726 				      bfd_h_put_32 (abfd, value,stabp + VALOFF);
727 				    }
728 
729 				  /* And then bale out.  */
730 				  break;
731 				}
732 
733 			      if (strcmp (name, "SLINE") == 0)
734 				{
735 				  /* Got a line entry.  */
736 				  if ((baseaddr + addr) <= (symval + value))
737 				    {
738 				      /* Adjust the line entry.  */
739 				      value += count;
740 
741 				      /* We need to put it back.  */
742 				      bfd_h_put_32 (abfd, value,stabp + VALOFF);
743 				      function_adjusted = 1;
744 				    }
745 				}
746 			    }
747 			}
748 		    }
749 		}
750 	    }
751 	}
752     }
753 
754   /* When adding an instruction back it is sometimes necessary to move any
755      global or local symbol that was referencing the first instruction of
756      the moved block to refer to the first instruction of the inserted block.
757 
758      For example adding a PAGE instruction before a CALL or JMP requires
759      that any label on the CALL or JMP is moved to the PAGE insn.  */
760   addr += noadj;
761 
762   /* Adjust the local symbols defined in this section.  */
763   isymend = isymbuf + symtab_hdr->sh_info;
764   for (isym = isymbuf; isym < isymend; isym++)
765     {
766       if (isym->st_shndx == shndx
767 	  && addr <= isym->st_value
768 	  && isym->st_value < endaddr)
769 	isym->st_value += count;
770     }
771 
772   /* Now adjust the global symbols defined in this section.  */
773   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
774 	      - symtab_hdr->sh_info);
775   sym_hashes = elf_sym_hashes (abfd);
776   end_hashes = sym_hashes + symcount;
777   for (; sym_hashes < end_hashes; sym_hashes++)
778     {
779       struct elf_link_hash_entry *sym_hash = *sym_hashes;
780 
781       if ((sym_hash->root.type == bfd_link_hash_defined
782 	   || sym_hash->root.type == bfd_link_hash_defweak)
783 	  && sym_hash->root.u.def.section == sec)
784 	{
785           if (addr <= sym_hash->root.u.def.value
786               && sym_hash->root.u.def.value < endaddr)
787 	    sym_hash->root.u.def.value += count;
788 	}
789     }
790 
791   return;
792 }
793 
794 /* Delete some bytes from a section while relaxing.  */
795 
796 static bfd_boolean
797 ip2k_elf_relax_delete_bytes (bfd *abfd,
798 			     asection *sec,
799 			     bfd_vma addr,
800 			     int count)
801 {
802   bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
803   bfd_vma endaddr = sec->size;
804 
805   /* Actually delete the bytes.  */
806   memmove (contents + addr, contents + addr + count,
807 	   endaddr - addr - count);
808 
809   sec->size -= count;
810 
811   adjust_all_relocations (abfd, sec, addr + count, endaddr, -count, 0);
812   return TRUE;
813 }
814 
815 static bfd_boolean
816 ip2k_delete_page_insn (bfd *abfd ATTRIBUTE_UNUSED,
817 		       asection *sec,
818 		       Elf_Internal_Rela *irel,
819 		       bfd_boolean *again,
820 		       struct misc *misc)
821 {
822   /* Note that we've changed the relocs, section contents, etc.  */
823   elf_section_data (sec)->relocs = misc->irelbase;
824   elf_section_data (sec)->this_hdr.contents = misc->contents;
825   misc->symtab_hdr->contents = (bfd_byte *) misc->isymbuf;
826 
827   /* Fix the relocation's type.  */
828   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_IP2K_NONE);
829 
830   /* Delete the PAGE insn.  */
831   if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset, 2))
832     return FALSE;
833 
834   /* Modified => will need to iterate relaxation again.  */
835   *again = TRUE;
836 
837   return TRUE;
838 }
839 
840 static bfd_boolean
841 ip2k_relax_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED,
842 			     asection *sec,
843 			     Elf_Internal_Rela *irel,
844 			     bfd_boolean *again,
845 			     struct misc *misc)
846 {
847   Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
848   Elf_Internal_Rela *ireltest = irel;
849   bfd_byte code[4];
850   bfd_vma addr;
851 
852   /* Test all page instructions.  */
853   addr = irel->r_offset;
854   while (1)
855     {
856       if (addr + 4 > sec->size)
857 	break;
858 
859       ip2k_get_mem (abfd, misc->contents + addr, 4, code);
860       if ((! IS_PAGE_OPCODE (code + 0))
861 	  || (! IS_JMP_OPCODE (code + 2)))
862 	break;
863 
864       /* Validate relocation entry (every entry should have a matching
865           relocation entry).  */
866       if (ireltest >= irelend)
867         {
868 	  _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
869           return FALSE;
870         }
871 
872       if (ireltest->r_offset != addr)
873         {
874 	  _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
875           return FALSE;
876         }
877 
878       if (! ip2k_test_page_insn (abfd, sec, ireltest, misc))
879 	/* Un-removable page insn => nothing can be done.  */
880 	return TRUE;
881 
882       addr += 4;
883       ireltest += 2;
884     }
885 
886   /* Relaxable. Adjust table header.  */
887   ip2k_get_mem (abfd, misc->contents + irel->r_offset - 4, 4, code);
888   if ((! IS_ADD_W_WREG_OPCODE (code + 0))
889       || (! IS_ADD_PCL_W_OPCODE (code + 2)))
890     {
891       _bfd_error_handler (_("ip2k relaxer: switch table header corrupt."));
892       return FALSE;
893     }
894 
895   if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset - 4, 2))
896     return FALSE;
897 
898   *again = TRUE;
899 
900   /* Delete all page instructions in table.  */
901   while (irel < ireltest)
902     {
903       if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc))
904 	return FALSE;
905       irel += 2;
906     }
907 
908   return TRUE;
909 }
910 
911 static bfd_boolean
912 ip2k_relax_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED,
913 			     asection *sec,
914 			     Elf_Internal_Rela *irel,
915 			     bfd_boolean *again,
916 			     struct misc *misc)
917 {
918   Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
919   Elf_Internal_Rela *ireltest = irel;
920   bfd_byte code[12];
921   bfd_vma addr;
922 
923   /* Test all page instructions.  */
924   addr = irel->r_offset;
925 
926   while (1)
927     {
928       if (addr + 4 > sec->size)
929 	break;
930 
931       ip2k_get_mem (abfd, misc->contents + addr, 4, code);
932 
933       if ((! IS_PAGE_OPCODE (code + 0))
934 	  || (! IS_JMP_OPCODE (code + 2)))
935 	break;
936 
937       /* Validate relocation entry (every entry should have a matching
938           relocation entry).  */
939       if (ireltest >= irelend)
940         {
941           _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
942           return FALSE;
943         }
944 
945       if (ireltest->r_offset != addr)
946         {
947           _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information."));
948           return FALSE;
949         }
950 
951       if (!ip2k_test_page_insn (abfd, sec, ireltest, misc))
952 	/* Un-removable page insn => nothing can be done.  */
953 	return TRUE;
954 
955       addr += 4;
956       ireltest += 2;
957     }
958 
959   /* Relaxable. Adjust table header.  */
960   ip2k_get_mem (abfd, misc->contents + irel->r_offset - 4, 2, code);
961   if (IS_PAGE_OPCODE (code))
962     addr = irel->r_offset - 16;
963   else
964     addr = irel->r_offset - 14;
965 
966   ip2k_get_mem (abfd, misc->contents + addr, 12, code);
967   if ((!IS_ADD_W_WREG_OPCODE (code + 0))
968       || (!IS_SNC_OPCODE (code + 2))
969       || (!IS_INC_1SP_OPCODE (code + 4))
970       || (!IS_ADD_2SP_W_OPCODE (code + 6))
971       || (!IS_SNC_OPCODE (code + 8))
972       || (!IS_INC_1SP_OPCODE (code + 10)))
973     {
974       _bfd_error_handler (_("ip2k relaxer: switch table header corrupt."));
975       return FALSE;
976     }
977 
978   /* Delete first 3 opcodes.  */
979   if (!ip2k_elf_relax_delete_bytes (abfd, sec, addr + 0, 6))
980     return FALSE;
981 
982   *again = TRUE;
983 
984   /* Delete all page instructions in table.  */
985   while (irel < ireltest)
986     {
987       if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc))
988 	return FALSE;
989       irel += 2;
990     }
991 
992   return TRUE;
993 }
994 
995 /* This function handles relaxation of a section in a specific page.  */
996 
997 static bfd_boolean
998 ip2k_elf_relax_section_page (bfd *abfd,
999 			     asection *sec,
1000 			     bfd_boolean *again,
1001 			     struct misc *misc,
1002 			     unsigned long page_start,
1003 			     unsigned long page_end)
1004 {
1005   Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count;
1006   Elf_Internal_Rela *irel;
1007   int switch_table_128;
1008   int switch_table_256;
1009 
1010   /* Walk thru the section looking for relaxation opportunities.  */
1011   for (irel = misc->irelbase; irel < irelend; irel++)
1012     {
1013       if (ELF32_R_TYPE (irel->r_info) != (int) R_IP2K_PAGE3)
1014 	/* Ignore non page instructions.  */
1015 	continue;
1016 
1017       if (BASEADDR (sec) + irel->r_offset < page_start)
1018 	/* Ignore page instructions on earlier page - they have
1019 	   already been processed. Remember that there is code flow
1020 	   that crosses a page boundary.  */
1021 	continue;
1022 
1023       if (BASEADDR (sec) + irel->r_offset > page_end)
1024 	/* Flow beyond end of page => nothing more to do for this page.  */
1025 	return TRUE;
1026 
1027       /* Detect switch tables.  */
1028       switch_table_128 = ip2k_is_switch_table_128 (abfd, sec, irel->r_offset, misc->contents);
1029       switch_table_256 = ip2k_is_switch_table_256 (abfd, sec, irel->r_offset, misc->contents);
1030 
1031       if ((switch_table_128 > 0) || (switch_table_256 > 0))
1032 	/* If the index is greater than 0 then it has already been processed.  */
1033 	continue;
1034 
1035       if (switch_table_128 == 0)
1036 	{
1037 	  if (!ip2k_relax_switch_table_128 (abfd, sec, irel, again, misc))
1038 	    return FALSE;
1039 
1040 	  continue;
1041 	}
1042 
1043       if (switch_table_256 == 0)
1044 	{
1045 	  if (!ip2k_relax_switch_table_256 (abfd, sec, irel, again, misc))
1046 	    return FALSE;
1047 
1048 	  continue;
1049 	}
1050 
1051       /* Simple relax.  */
1052       if (ip2k_test_page_insn (abfd, sec, irel, misc))
1053 	{
1054 	  if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc))
1055 	    return FALSE;
1056 
1057 	  continue;
1058 	}
1059     }
1060 
1061   return TRUE;
1062 }
1063 
1064 /* This function handles relaxing for the ip2k.
1065 
1066    Principle: Start with the first page and remove page instructions that
1067    are not require on this first page. By removing page instructions more
1068    code will fit into this page - repeat until nothing more can be achieved
1069    for this page. Move on to the next page.
1070 
1071    Processing the pages one at a time from the lowest page allows a removal
1072    only policy to be used - pages can be removed but are never reinserted.  */
1073 
1074 static bfd_boolean
1075 ip2k_elf_relax_section (bfd *abfd,
1076 			asection *sec,
1077 			struct bfd_link_info *link_info,
1078 			bfd_boolean *again)
1079 {
1080   Elf_Internal_Shdr *symtab_hdr;
1081   Elf_Internal_Rela *internal_relocs;
1082   bfd_byte *contents = NULL;
1083   Elf_Internal_Sym *isymbuf = NULL;
1084   static asection * first_section = NULL;
1085   static unsigned long search_addr;
1086   static unsigned long page_start = 0;
1087   static unsigned long page_end = 0;
1088   static unsigned int pass = 0;
1089   static bfd_boolean new_pass = FALSE;
1090   static bfd_boolean changed = FALSE;
1091   struct misc misc;
1092   asection *stab;
1093 
1094   /* Assume nothing changes.  */
1095   *again = FALSE;
1096 
1097   if (first_section == NULL)
1098     {
1099       ip2k_relaxed = TRUE;
1100       first_section = sec;
1101     }
1102 
1103   if (first_section == sec)
1104     {
1105       pass++;
1106       new_pass = TRUE;
1107     }
1108 
1109   /* We don't have to do anything for a relocatable link,
1110      if this section does not have relocs, or if this is
1111      not a code section.  */
1112   if (link_info->relocatable
1113       || (sec->flags & SEC_RELOC) == 0
1114       || sec->reloc_count == 0
1115       || (sec->flags & SEC_CODE) == 0)
1116     return TRUE;
1117 
1118   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1119 
1120   internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
1121 					       link_info->keep_memory);
1122   if (internal_relocs == NULL)
1123     goto error_return;
1124 
1125   /* Make sure the stac.rela stuff gets read in.  */
1126   stab = bfd_get_section_by_name (abfd, ".stab");
1127 
1128   if (stab)
1129     {
1130       /* So stab does exits.  */
1131       Elf_Internal_Rela * irelbase;
1132 
1133       irelbase = _bfd_elf_link_read_relocs (abfd, stab, NULL, NULL,
1134 					    link_info->keep_memory);
1135     }
1136 
1137   /* Get section contents cached copy if it exists.  */
1138   if (contents == NULL)
1139     {
1140       /* Get cached copy if it exists.  */
1141       if (elf_section_data (sec)->this_hdr.contents != NULL)
1142 	contents = elf_section_data (sec)->this_hdr.contents;
1143       else
1144 	{
1145 	  /* Go get them off disk.  */
1146 	  if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1147 	    goto error_return;
1148 	}
1149     }
1150 
1151   /* Read this BFD's symbols cached copy if it exists.  */
1152   if (isymbuf == NULL && symtab_hdr->sh_info != 0)
1153     {
1154       isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1155       if (isymbuf == NULL)
1156 	isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1157 					symtab_hdr->sh_info, 0,
1158 					NULL, NULL, NULL);
1159       if (isymbuf == NULL)
1160 	goto error_return;
1161     }
1162 
1163   misc.symtab_hdr = symtab_hdr;
1164   misc.isymbuf = isymbuf;
1165   misc.irelbase = internal_relocs;
1166   misc.contents = contents;
1167 
1168   /* This is where all the relaxation actually get done.  */
1169   if ((pass == 1) || (new_pass && !changed))
1170     {
1171       /* On the first pass we simply search for the lowest page that
1172          we havn't relaxed yet. Note that the pass count is reset
1173          each time a page is complete in order to move on to the next page.
1174          If we can't find any more pages then we are finished.  */
1175       if (new_pass)
1176 	{
1177 	  pass = 1;
1178 	  new_pass = FALSE;
1179 	  changed = TRUE; /* Pre-initialize to break out of pass 1.  */
1180 	  search_addr = 0xFFFFFFFF;
1181 	}
1182 
1183       if ((BASEADDR (sec) + sec->size < search_addr)
1184 	  && (BASEADDR (sec) + sec->size > page_end))
1185 	{
1186 	  if (BASEADDR (sec) <= page_end)
1187 	    search_addr = page_end + 1;
1188 	  else
1189 	    search_addr = BASEADDR (sec);
1190 
1191 	  /* Found a page => more work to do.  */
1192 	  *again = TRUE;
1193 	}
1194     }
1195   else
1196     {
1197       if (new_pass)
1198 	{
1199 	  new_pass = FALSE;
1200 	  changed = FALSE;
1201 	  page_start = PAGENO (search_addr);
1202 	  page_end = page_start | 0x00003FFF;
1203 	}
1204 
1205       /* Only process sections in range.  */
1206       if ((BASEADDR (sec) + sec->size >= page_start)
1207 	  && (BASEADDR (sec) <= page_end))
1208 	{
1209           if (!ip2k_elf_relax_section_page (abfd, sec, &changed, &misc, page_start, page_end))
1210 	    return FALSE;
1211 	}
1212       *again = TRUE;
1213     }
1214 
1215   /* Perform some house keeping after relaxing the section.  */
1216 
1217   if (isymbuf != NULL
1218       && symtab_hdr->contents != (unsigned char *) isymbuf)
1219     {
1220       if (! link_info->keep_memory)
1221 	free (isymbuf);
1222       else
1223 	symtab_hdr->contents = (unsigned char *) isymbuf;
1224     }
1225 
1226   if (contents != NULL
1227       && elf_section_data (sec)->this_hdr.contents != contents)
1228     {
1229       if (! link_info->keep_memory)
1230 	free (contents);
1231       else
1232 	{
1233 	  /* Cache the section contents for elf_link_input_bfd.  */
1234 	  elf_section_data (sec)->this_hdr.contents = contents;
1235 	}
1236     }
1237 
1238   if (internal_relocs != NULL
1239       && elf_section_data (sec)->relocs != internal_relocs)
1240     free (internal_relocs);
1241 
1242   return TRUE;
1243 
1244  error_return:
1245   if (isymbuf != NULL
1246       && symtab_hdr->contents != (unsigned char *) isymbuf)
1247     free (isymbuf);
1248   if (contents != NULL
1249       && elf_section_data (sec)->this_hdr.contents != contents)
1250     free (contents);
1251   if (internal_relocs != NULL
1252       && elf_section_data (sec)->relocs != internal_relocs)
1253     free (internal_relocs);
1254   return FALSE;
1255 }
1256 
1257 /* Set the howto pointer for a IP2K ELF reloc.  */
1258 
1259 static void
1260 ip2k_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
1261 			 arelent * cache_ptr,
1262 			 Elf_Internal_Rela * dst)
1263 {
1264   unsigned int r_type;
1265 
1266   r_type = ELF32_R_TYPE (dst->r_info);
1267   cache_ptr->howto = & ip2k_elf_howto_table [r_type];
1268 }
1269 
1270 /* Perform a single relocation.
1271    By default we use the standard BFD routines.  */
1272 
1273 static bfd_reloc_status_type
1274 ip2k_final_link_relocate (reloc_howto_type *  howto,
1275 			  bfd *               input_bfd,
1276 			  asection *          input_section,
1277 			  bfd_byte *          contents,
1278 			  Elf_Internal_Rela * rel,
1279 			  bfd_vma             relocation)
1280 {
1281   static bfd_vma page_addr = 0;
1282 
1283   bfd_reloc_status_type r = bfd_reloc_ok;
1284   switch (howto->type)
1285     {
1286       /* Handle data space relocations.  */
1287     case R_IP2K_FR9:
1288     case R_IP2K_BANK:
1289       if ((relocation & IP2K_DATA_MASK) == IP2K_DATA_VALUE)
1290 	relocation &= ~IP2K_DATA_MASK;
1291       else
1292 	r = bfd_reloc_notsupported;
1293       break;
1294 
1295     case R_IP2K_LO8DATA:
1296     case R_IP2K_HI8DATA:
1297     case R_IP2K_EX8DATA:
1298       break;
1299 
1300       /* Handle insn space relocations.  */
1301     case R_IP2K_PAGE3:
1302       page_addr = BASEADDR (input_section) + rel->r_offset;
1303       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1304 	relocation &= ~IP2K_INSN_MASK;
1305       else
1306 	r = bfd_reloc_notsupported;
1307       break;
1308 
1309     case R_IP2K_ADDR16CJP:
1310       if (BASEADDR (input_section) + rel->r_offset != page_addr + 2)
1311 	{
1312 	  /* No preceding page instruction, verify that it isn't needed.  */
1313 	  if (PAGENO (relocation + rel->r_addend) !=
1314 	      ip2k_nominal_page_bits (input_bfd, input_section,
1315 	      			      rel->r_offset, contents))
1316 	    _bfd_error_handler (_("ip2k linker: missing page instruction at 0x%08lx (dest = 0x%08lx)."),
1317 				BASEADDR (input_section) + rel->r_offset,
1318 				relocation + rel->r_addend);
1319         }
1320       else if (ip2k_relaxed)
1321         {
1322           /* Preceding page instruction. Verify that the page instruction is
1323              really needed. One reason for the relaxation to miss a page is if
1324              the section is not marked as executable.  */
1325 	  if (!ip2k_is_switch_table_128 (input_bfd, input_section,
1326 					 rel->r_offset - 2, contents)
1327 	      && !ip2k_is_switch_table_256 (input_bfd, input_section,
1328 					    rel->r_offset - 2, contents)
1329 	      && (PAGENO (relocation + rel->r_addend) ==
1330 		  ip2k_nominal_page_bits (input_bfd, input_section,
1331 					  rel->r_offset - 2, contents)))
1332 	    _bfd_error_handler (_("ip2k linker: redundant page instruction at 0x%08lx (dest = 0x%08lx)."),
1333 				page_addr,
1334 				relocation + rel->r_addend);
1335         }
1336       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1337 	relocation &= ~IP2K_INSN_MASK;
1338       else
1339 	r = bfd_reloc_notsupported;
1340       break;
1341 
1342     case R_IP2K_LO8INSN:
1343     case R_IP2K_HI8INSN:
1344     case R_IP2K_PC_SKIP:
1345       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1346 	relocation &= ~IP2K_INSN_MASK;
1347       else
1348 	r = bfd_reloc_notsupported;
1349       break;
1350 
1351     case R_IP2K_16:
1352       /* If this is a relocation involving a TEXT
1353 	 symbol, reduce it to a word address.  */
1354       if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE)
1355 	howto = &ip2k_elf_howto_table[ (int) R_IP2K_TEXT];
1356       break;
1357 
1358       /* Pass others through.  */
1359     default:
1360       break;
1361     }
1362 
1363   /* Only install relocation if above tests did not disqualify it.  */
1364   if (r == bfd_reloc_ok)
1365     r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1366 				  contents, rel->r_offset,
1367 				  relocation, rel->r_addend);
1368 
1369   return r;
1370 }
1371 
1372 /* Relocate a IP2K ELF section.
1373 
1374    The RELOCATE_SECTION function is called by the new ELF backend linker
1375    to handle the relocations for a section.
1376 
1377    The relocs are always passed as Rela structures; if the section
1378    actually uses Rel structures, the r_addend field will always be
1379    zero.
1380 
1381    This function is responsible for adjusting the section contents as
1382    necessary, and (if using Rela relocs and generating a relocatable
1383    output file) adjusting the reloc addend as necessary.
1384 
1385    This function does not have to worry about setting the reloc
1386    address or the reloc symbol index.
1387 
1388    LOCAL_SYMS is a pointer to the swapped in local symbols.
1389 
1390    LOCAL_SECTIONS is an array giving the section in the input file
1391    corresponding to the st_shndx field of each local symbol.
1392 
1393    The global hash table entry for the global symbols can be found
1394    via elf_sym_hashes (input_bfd).
1395 
1396    When generating relocatable output, this function must handle
1397    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
1398    going to be the section symbol corresponding to the output
1399    section, which means that the addend must be adjusted
1400    accordingly.  */
1401 
1402 static bfd_boolean
1403 ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1404 			   struct bfd_link_info *info,
1405 			   bfd *input_bfd,
1406 			   asection *input_section,
1407 			   bfd_byte *contents,
1408 			   Elf_Internal_Rela *relocs,
1409 			   Elf_Internal_Sym *local_syms,
1410 			   asection **local_sections)
1411 {
1412   Elf_Internal_Shdr *symtab_hdr;
1413   struct elf_link_hash_entry **sym_hashes;
1414   Elf_Internal_Rela *rel;
1415   Elf_Internal_Rela *relend;
1416 
1417   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1418   sym_hashes = elf_sym_hashes (input_bfd);
1419   relend     = relocs + input_section->reloc_count;
1420 
1421   for (rel = relocs; rel < relend; rel ++)
1422     {
1423       reloc_howto_type *           howto;
1424       unsigned long                r_symndx;
1425       Elf_Internal_Sym *           sym;
1426       asection *                   sec;
1427       struct elf_link_hash_entry * h;
1428       bfd_vma                      relocation;
1429       bfd_reloc_status_type        r;
1430       const char *                 name = NULL;
1431       int                          r_type;
1432 
1433       r_type = ELF32_R_TYPE (rel->r_info);
1434       r_symndx = ELF32_R_SYM (rel->r_info);
1435       howto  = ip2k_elf_howto_table + ELF32_R_TYPE (rel->r_info);
1436       h      = NULL;
1437       sym    = NULL;
1438       sec    = NULL;
1439 
1440       if (r_symndx < symtab_hdr->sh_info)
1441 	{
1442 	  sym = local_syms + r_symndx;
1443 	  sec = local_sections [r_symndx];
1444 	  relocation = BASEADDR (sec) + sym->st_value;
1445 
1446 	  name = bfd_elf_string_from_elf_section
1447 	    (input_bfd, symtab_hdr->sh_link, sym->st_name);
1448 	  name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
1449 	}
1450       else
1451 	{
1452 	  bfd_boolean warned;
1453 	  bfd_boolean unresolved_reloc;
1454 
1455 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1456 				   r_symndx, symtab_hdr, sym_hashes,
1457 				   h, sec, relocation,
1458 				   unresolved_reloc, warned);
1459 
1460 	  name = h->root.root.string;
1461 	}
1462 
1463       if (sec != NULL && elf_discarded_section (sec))
1464 	{
1465 	  /* For relocs against symbols from removed linkonce sections,
1466 	     or sections discarded by a linker script, we just want the
1467 	     section contents zeroed.  Avoid any special processing.  */
1468 	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
1469 	  rel->r_info = 0;
1470 	  rel->r_addend = 0;
1471 	  continue;
1472 	}
1473 
1474       if (info->relocatable)
1475 	continue;
1476 
1477       /* Finally, the sole IP2K-specific part.  */
1478       r = ip2k_final_link_relocate (howto, input_bfd, input_section,
1479 				     contents, rel, relocation);
1480 
1481       if (r != bfd_reloc_ok)
1482 	{
1483 	  const char * msg = NULL;
1484 
1485 	  switch (r)
1486 	    {
1487 	    case bfd_reloc_overflow:
1488 	      r = info->callbacks->reloc_overflow
1489 		(info, (h ? &h->root : NULL), name, howto->name,
1490 		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1491 	      break;
1492 
1493 	    case bfd_reloc_undefined:
1494 	      r = info->callbacks->undefined_symbol
1495 		(info, name, input_bfd, input_section, rel->r_offset, TRUE);
1496 	      break;
1497 
1498 	    case bfd_reloc_outofrange:
1499 	      msg = _("internal error: out of range error");
1500 	      break;
1501 
1502 	      /* This is how ip2k_final_link_relocate tells us of a non-kosher
1503                  reference between insn & data address spaces.  */
1504 	    case bfd_reloc_notsupported:
1505               if (sym != NULL) /* Only if it's not an unresolved symbol.  */
1506 	         msg = _("unsupported relocation between data/insn address spaces");
1507 	      break;
1508 
1509 	    case bfd_reloc_dangerous:
1510 	      msg = _("internal error: dangerous relocation");
1511 	      break;
1512 
1513 	    default:
1514 	      msg = _("internal error: unknown error");
1515 	      break;
1516 	    }
1517 
1518 	  if (msg)
1519 	    r = info->callbacks->warning
1520 	      (info, msg, name, input_bfd, input_section, rel->r_offset);
1521 
1522 	  if (! r)
1523 	    return FALSE;
1524 	}
1525     }
1526 
1527   return TRUE;
1528 }
1529 
1530 #define TARGET_BIG_SYM	 bfd_elf32_ip2k_vec
1531 #define TARGET_BIG_NAME  "elf32-ip2k"
1532 
1533 #define ELF_ARCH	 bfd_arch_ip2k
1534 #define ELF_MACHINE_CODE EM_IP2K
1535 #define ELF_MACHINE_ALT1 EM_IP2K_OLD
1536 #define ELF_MAXPAGESIZE  1 /* No pages on the IP2K.  */
1537 
1538 #define elf_info_to_howto_rel			NULL
1539 #define elf_info_to_howto			ip2k_info_to_howto_rela
1540 
1541 #define elf_backend_can_gc_sections     	1
1542 #define elf_backend_rela_normal			1
1543 #define elf_backend_relocate_section		ip2k_elf_relocate_section
1544 
1545 #define elf_symbol_leading_char			'_'
1546 #define bfd_elf32_bfd_reloc_type_lookup		ip2k_reloc_type_lookup
1547 #define bfd_elf32_bfd_reloc_name_lookup	ip2k_reloc_name_lookup
1548 #define bfd_elf32_bfd_relax_section		ip2k_elf_relax_section
1549 
1550 #include "elf32-target.h"
1551